摘要:程序員面試金典題目字符串確定兩個(gè)字符串同構(gòu)的字符重新排列后,能否變成詳細(xì)第一步先判斷兩個(gè)字符串的長(zhǎng)度是否相等字符串的長(zhǎng)度為有括號(hào)數(shù)組清除二維數(shù)組行列將數(shù)組中所有為的元素所在的行列都置為讀數(shù)據(jù)和寫(xiě)數(shù)據(jù)必須分開(kāi)。
《程序員面試金典》 題目 1.3 字符串 確定兩個(gè)字符串同構(gòu)
StringA的字符重新排列后,能否變成StringB 詳細(xì)
import java.util.*; public class Same { public boolean checkSam(String stringA, String stringB) { // write code here if(stringA.length()!=stringB.length()) return false; int[] recoder = new int[256]; for(int i=0;itips:
第一步先判斷兩個(gè)字符串的長(zhǎng)度是否相等
字符串的長(zhǎng)度為.length()有括號(hào)
1.7 數(shù)組 清除二維數(shù)組行列將數(shù)組中所有為0的元素所在的行列都置為0
import java.util.*; public class Clearer { public int[][] clearZero(int[][] mat, int n) { // write code here boolean[] row = new boolean[n]; boolean[] col = new boolean[n]; for(int i=0;itips
讀數(shù)據(jù)和寫(xiě)數(shù)據(jù)必須分開(kāi)。
1.8字符串 翻轉(zhuǎn)子串檢查string2是否為sting1旋轉(zhuǎn)而成
public boolean checkReverseEqual(String s1, String s2) { // write code here if (s1 == null || s2 == null || s1.length() != s2.length()) return false; return (s1+s1).contains(s2); }tips
旋轉(zhuǎn)問(wèn)題:先將string1 收尾拼接,再檢查新的字符串是否含有s2.
2.2鏈表 鏈表中倒數(shù)第k個(gè)結(jié)點(diǎn)輸入一個(gè)鏈表,輸出該鏈表中倒數(shù)第k個(gè)結(jié)點(diǎn)
public ListNode FindKthToTail(ListNode head,int k) { //需不需要new??? //ListNode headp = new ListNode(-1); if(head == null||k<1) return null; ListNode tailp = head; ListNode headp = head; for(int i=1;itips
new一個(gè)obj1對(duì)象,然后obj1 = obj2 ,錯(cuò)錯(cuò)錯(cuò)
核心思想:兩個(gè)指針,相差k-1,tail指到尾,則前指針正好找到想要的位置。
另外一種思路是采用遞歸,head==null時(shí),將count置零,之后count++。
2.3鏈表 訪問(wèn)單個(gè)節(jié)點(diǎn)的刪除刪除單向鏈表中間的某個(gè)結(jié)點(diǎn),并且只能訪問(wèn)該結(jié)點(diǎn)
public boolean removeNode(ListNode pNode) { // write code here if(pNode == null || pNode.next == null) return false; pNode.val = pNode.next.val; pNode.next = pNode.next.next; return true; }tips
只能訪問(wèn)該節(jié)點(diǎn),則不能刪除該節(jié)點(diǎn),因?yàn)閯h除之后則鏈表與前面斷開(kāi)鏈接,所有只能修改該節(jié)點(diǎn)的值為下一節(jié)點(diǎn)的值,再指向下下節(jié)點(diǎn)。
2.5鏈表 鏈?zhǔn)紸+B鏈表頭為個(gè)位,A{1,2,3},B{3,2,1},則返回{4,4,4}
public ListNode plusAB(ListNode a, ListNode b) { // write code here int flag = 0; ListNode result = new ListNode(-1); ListNode phead = result; while(a!=null || b!=null || flag!=0){ int sum = flag; if(a!=null){ sum+=a.val; a = a.next; } if(b!=null){ sum+=b.val; b = b.next; } int val = sum%10; flag = sum/10; result.next = new ListNode(val); result = result.next; } return phead.next; }tips
之前有一個(gè)想法就是先相加公共部分,然后處理多出來(lái)的部分,這樣處理起來(lái)非常麻煩。
如果鏈表頭為高位,則采用棧方法處理。先對(duì)兩個(gè)鏈表分別壓棧,最后弾棧,直至兩個(gè)都為空并且進(jìn)位等于0。
2.7鏈表 回文鏈表檢查鏈表是否為回文,{1,2,3,2,1},返回true
public boolean isPalindrome(ListNode pHead) { // 快慢指針 ListNode fast = pHead; ListNode slow = pHead; Stackstack = new Stack<>(); while(fast != null && fast.next != null){ stack.push(slow.val); slow = slow.next; fast = fast.next.next; } if(fast != null) slow = slow.next; while(slow != null){ if(slow.val != stack.pop()) return false; slow = slow.next; } return true; } public boolean isPalindrome(ListNode pHead) { //雙棧 if(pHead == null || pHead.next == null) return true; Stack stack1 = new Stack(); Stack stack2 = new Stack(); while(pHead!=null){ stack1.push(pHead.val); pHead = pHead.next; } while(stack1.size()>stack2.size()){ stack2.push(stack1.pop()); } if(stack2.size()>stack1.size()){ stack2.pop(); } while(!stack1.empty() && !stack2.empty()){ if(stack1.pop() != stack2.pop()) return false; } return true; } tips
方案1:用快慢指針,當(dāng)快指針指向鏈表尾部時(shí),慢指針正好指向中部,并且將慢指針壓棧,這里要注意奇偶數(shù)的區(qū)別。
方案2:先將所有鏈表數(shù)據(jù)壓到棧1,然后彈出一半到棧2,兩者再進(jìn)行比較。不過(guò)該方法顯然沒(méi)有方法一效率高。
3.5棧和隊(duì)列 用兩個(gè)棧實(shí)現(xiàn)隊(duì)列public class Solution { Stackstack1 = new Stack (); Stack stack2 = new Stack (); public void push(int node) { stack1.push(node); } public int pop() { if(stack1.isEmpty() && stack2.isEmpty()){ throw new RuntimeException("the queue is empty!"); } if(stack2.isEmpty()){ while(!stack1.isEmpty()){ stack2.push(stack1.pop()); } } return stack2.pop(); } } tips
throw new RuntimeException("the queue is empty!");下次可以用
3.6棧和隊(duì)列 雙棧排序要求只有一個(gè)緩存棧,并且排好序的棧最大元素在棧頂。
public ArrayListtwoStacksSort(int[] numbers) { // write code here ArrayList arrayList = new ArrayList(); Stack stack1 = new Stack(); Stack stack2 = new Stack(); for(int i=0;i temp){ stack1.push(stack2.pop()); } stack2.push(temp); } while(!stack2.isEmpty()){ arrayList.add(stack2.pop()); } return arrayList; } tips
while(!stack2.isEmpty() && stack2.peek()>temp){ stack1.push(stack2.pop()); } stack2.push(temp);代碼的簡(jiǎn)潔性!思維不要太僵硬,可以多層條件一起考慮,不必非要一層一層考慮分析。
不要先考慮stack2是否為空,再嵌套考慮棧頂是否大于temp。。。
4.1 樹(shù) 檢查二叉樹(shù)是否平衡樹(shù)的平衡指左右高度相差不能大于1
public boolean isBalance(TreeNode root) { // 遍歷整個(gè)樹(shù)的所有節(jié)點(diǎn) if(root == null)return true; int left = getHeight(root.left); int right = getHeight(root.right); int cha = Math.abs(left-right); if(cha>1)return false; else return true; } public int getHeight(TreeNode root){ if(root == null) return 0; int left = getHeight(root.left); int right = getHeight(root.right); return Math.max(left,right)+1; }另一種解法:一邊檢查高度一邊檢查是否平衡
public boolean isBalance(TreeNode root) { // write code here if(root == null)return true; if(getHeight(root) == -1)return false; return true; } public int getHeight(TreeNode root){ if(root == null) return 0; int left = getHeight(root.left); if(left == -1) return -1; int right = getHeight(root.right); if(right == -1) return -1; if(Math.abs(left-right)>1) return -1; else return Math.max(left,right)+1; }tips
這樣的改進(jìn)的好處在于不用遍歷所有的樹(shù)節(jié)點(diǎn)
4.3最小二叉查找樹(shù)給定一個(gè)元素各不相同的升序數(shù)組,生成一個(gè)最小二叉查找樹(shù)
public TreeNode creatBST(int[] arr,int start,int end){ if(start>end)return null; int mid = (start+end)>>1; TreeNode n = new TreeNode(arr[mid]); n.left = creatBST(arr,start,mid-1); n.right = creatBST(arr,mid+1;end); return n; }tips
二叉查找樹(shù):數(shù)組的中間值為根,根的左子樹(shù)元素值全部小于根節(jié)點(diǎn)值,根的右子樹(shù)大于根節(jié)點(diǎn)。
4.4 樹(shù) 輸出單層節(jié)點(diǎn)給定一顆二叉樹(shù),創(chuàng)建含有某一深度上所有結(jié)點(diǎn)的鏈表。
private ListNode result= new ListNode(-1); public ListNode getTreeLevel(TreeNode root, int dep) { // write code here ListNode list = result; getTree(root,dep,1); return list.next; } public void getTree(TreeNode root,int dep,int i){ if(root == null) return; if(i == dep){ result.next = new ListNode(root.val); result = result.next; }else{ getTree(root.left,dep,i+1); getTree(root.right,dep,i+1); } }4.5 樹(shù) 檢查是否為BST(二叉查找樹(shù))int former = Integer.MIN_VALUE; public boolean checkBST(TreeNode root){ if(root == null) return true; if(!checkBST(root.left)) return false; if(root.val <= former) return false; former = root.val; if(!checkBST(root.right)) return false; return true; }tips
先序遍歷:左中右順序,這樣保證每一個(gè)元素值比上一個(gè)元素值大即可。
對(duì)上一層返回?cái)?shù)據(jù)的處理:if語(yǔ)句
Integer.MIN_VALUE即min-value是Integer類里面的變量值。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/65268.html
摘要:我的是忙碌的一年,從年初備戰(zhàn)實(shí)習(xí)春招,年三十都在死磕源碼,三月份經(jīng)歷了阿里五次面試,四月順利收到實(shí)習(xí)。因?yàn)槲倚睦砗芮宄?,我的目?biāo)是阿里。所以在收到阿里之后的那晚,我重新規(guī)劃了接下來(lái)的學(xué)習(xí)計(jì)劃,將我的短期目標(biāo)更新成拿下阿里轉(zhuǎn)正。 我的2017是忙碌的一年,從年初備戰(zhàn)實(shí)習(xí)春招,年三十都在死磕JDK源碼,三月份經(jīng)歷了阿里五次面試,四月順利收到實(shí)習(xí)offer。然后五月懷著忐忑的心情開(kāi)始了螞蟻金...
摘要:關(guān)于自己屆畢業(yè)生一本雙非學(xué)校,非科班可能和很多人一樣,因?yàn)樾r(shí)候喜歡打游戲,所以大學(xué)一直想學(xué)編程,但因?yàn)榉N種原因,自己來(lái)到了一個(gè)硬件相關(guān)專業(yè),但由于現(xiàn)實(shí)和興趣,自己又從事了軟件相關(guān)的工作。找實(shí)習(xí)實(shí)習(xí)對(duì)于之后的秋招來(lái)說(shuō),是非常非常重要的。 ...
文章目錄 一、題目1、題目描述2、基礎(chǔ)框架3、原題鏈接 二、解題報(bào)告1、思路分析2、時(shí)間復(fù)雜度3、代碼詳解 三、本題小知識(shí)四、加群須知 一、題目 1、題目描述 ??給你一棵二叉搜索樹(shù),請(qǐng)按 中序遍歷 將其重新排列為一棵遞增順序搜索樹(shù),使樹(shù)中最左邊的節(jié)點(diǎn)成為樹(shù)的根節(jié)點(diǎn),并且每個(gè)節(jié)點(diǎn)沒(méi)有左子節(jié)點(diǎn),只有一個(gè)右子節(jié)點(diǎn)。??樣例輸入: [5,3,6,2,4,null,8,1,null,null,nu...
摘要:碰到這種面試官,你只有是個(gè)題霸,再加上眼緣夠才能順利入圍。只要按照我題目的思路,甚至打出來(lái)測(cè)試用例看看,就能實(shí)現(xiàn)這個(gè)題目了。答案根據(jù)的,對(duì)答案做出修正。另我的答案絕不敢稱最佳,隨時(shí)歡迎優(yōu)化修正。但了解總歸是好的。 我們?cè)陂L(zhǎng)期的面試過(guò)程中,經(jīng)歷了種種苦不堪言,不訴苦感覺(jué)不過(guò)癮(我盡量控制),然后主要聊聊常見(jiàn)JavaScript面試題的解法,以及面試注意事項(xiàng) 憶苦 面試第一苦,面試官的土 ...
摘要:很多前端同學(xué)在看到數(shù)據(jù)結(jié)構(gòu)和算法后會(huì)有一定的抵觸心理,或者嘗試去練習(xí),但是被難倒,從而放棄。本文選擇的數(shù)據(jù)結(jié)構(gòu)和算法的類別均是出現(xiàn)頻率最高,以及應(yīng)用最廣的類別。面試這是非?,F(xiàn)實(shí)的一點(diǎn),也是很多前端學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)和算法的原因。 一、導(dǎo)讀 據(jù)我了解,前端程序員有相當(dāng)一部分對(duì)數(shù)據(jù)結(jié)構(gòu)和算法的基礎(chǔ)概念都不是很清晰,這直接導(dǎo)致很多人在看到有關(guān)這部分的內(nèi)容就會(huì)望而卻步。 實(shí)際上,當(dāng)你了解了數(shù)據(jù)結(jié)構(gòu)和...
閱讀 1435·2021-09-22 15:52
閱讀 1481·2019-08-30 15:44
閱讀 905·2019-08-30 14:24
閱讀 2715·2019-08-30 13:06
閱讀 2711·2019-08-26 13:45
閱讀 2795·2019-08-26 13:43
閱讀 1027·2019-08-26 12:01
閱讀 1457·2019-08-26 11:56