摘要:程序員面試金典題目字符串確定兩個字符串同構的字符重新排列后,能否變成詳細第一步先判斷兩個字符串的長度是否相等字符串的長度為有括號數組清除二維數組行列將數組中所有為的元素所在的行列都置為讀數據和寫數據必須分開。
《程序員面試金典》 題目 1.3 字符串 確定兩個字符串同構
StringA的字符重新排列后,能否變成StringB 詳細
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:
第一步先判斷兩個字符串的長度是否相等
字符串的長度為.length()有括號
1.7 數組 清除二維數組行列將數組中所有為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
讀數據和寫數據必須分開。
1.8字符串 翻轉子串檢查string2是否為sting1旋轉而成
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
旋轉問題:先將string1 收尾拼接,再檢查新的字符串是否含有s2.
2.2鏈表 鏈表中倒數第k個結點輸入一個鏈表,輸出該鏈表中倒數第k個結點
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一個obj1對象,然后obj1 = obj2 ,錯錯錯
核心思想:兩個指針,相差k-1,tail指到尾,則前指針正好找到想要的位置。
另外一種思路是采用遞歸,head==null時,將count置零,之后count++。
2.3鏈表 訪問單個節點的刪除刪除單向鏈表中間的某個結點,并且只能訪問該結點
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
只能訪問該節點,則不能刪除該節點,因為刪除之后則鏈表與前面斷開鏈接,所有只能修改該節點的值為下一節點的值,再指向下下節點。
2.5鏈表 鏈式A+B鏈表頭為個位,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
之前有一個想法就是先相加公共部分,然后處理多出來的部分,這樣處理起來非常麻煩。
如果鏈表頭為高位,則采用棧方法處理。先對兩個鏈表分別壓棧,最后弾棧,直至兩個都為空并且進位等于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:用快慢指針,當快指針指向鏈表尾部時,慢指針正好指向中部,并且將慢指針壓棧,這里要注意奇偶數的區別。
方案2:先將所有鏈表數據壓到棧1,然后彈出一半到棧2,兩者再進行比較。不過該方法顯然沒有方法一效率高。
3.5棧和隊列 用兩個棧實現隊列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棧和隊列 雙棧排序要求只有一個緩存棧,并且排好序的棧最大元素在棧頂。
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);代碼的簡潔性!思維不要太僵硬,可以多層條件一起考慮,不必非要一層一層考慮分析。
不要先考慮stack2是否為空,再嵌套考慮棧頂是否大于temp。。。
4.1 樹 檢查二叉樹是否平衡樹的平衡指左右高度相差不能大于1
public boolean isBalance(TreeNode root) { // 遍歷整個樹的所有節點 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
這樣的改進的好處在于不用遍歷所有的樹節點
4.3最小二叉查找樹給定一個元素各不相同的升序數組,生成一個最小二叉查找樹
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
二叉查找樹:數組的中間值為根,根的左子樹元素值全部小于根節點值,根的右子樹大于根節點。
4.4 樹 輸出單層節點給定一顆二叉樹,創建含有某一深度上所有結點的鏈表。
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 樹 檢查是否為BST(二叉查找樹)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
先序遍歷:左中右順序,這樣保證每一個元素值比上一個元素值大即可。
對上一層返回數據的處理:if語句
Integer.MIN_VALUE即min-value是Integer類里面的變量值。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/65268.html
摘要:我的是忙碌的一年,從年初備戰實習春招,年三十都在死磕源碼,三月份經歷了阿里五次面試,四月順利收到實習。因為我心理很清楚,我的目標是阿里。所以在收到阿里之后的那晚,我重新規劃了接下來的學習計劃,將我的短期目標更新成拿下阿里轉正。 我的2017是忙碌的一年,從年初備戰實習春招,年三十都在死磕JDK源碼,三月份經歷了阿里五次面試,四月順利收到實習offer。然后五月懷著忐忑的心情開始了螞蟻金...
摘要:關于自己屆畢業生一本雙非學校,非科班可能和很多人一樣,因為小時候喜歡打游戲,所以大學一直想學編程,但因為種種原因,自己來到了一個硬件相關專業,但由于現實和興趣,自己又從事了軟件相關的工作。找實習實習對于之后的秋招來說,是非常非常重要的。 ...
文章目錄 一、題目1、題目描述2、基礎框架3、原題鏈接 二、解題報告1、思路分析2、時間復雜度3、代碼詳解 三、本題小知識四、加群須知 一、題目 1、題目描述 ??給你一棵二叉搜索樹,請按 中序遍歷 將其重新排列為一棵遞增順序搜索樹,使樹中最左邊的節點成為樹的根節點,并且每個節點沒有左子節點,只有一個右子節點。??樣例輸入: [5,3,6,2,4,null,8,1,null,null,nu...
摘要:碰到這種面試官,你只有是個題霸,再加上眼緣夠才能順利入圍。只要按照我題目的思路,甚至打出來測試用例看看,就能實現這個題目了。答案根據的,對答案做出修正。另我的答案絕不敢稱最佳,隨時歡迎優化修正。但了解總歸是好的。 我們在長期的面試過程中,經歷了種種苦不堪言,不訴苦感覺不過癮(我盡量控制),然后主要聊聊常見JavaScript面試題的解法,以及面試注意事項 憶苦 面試第一苦,面試官的土 ...
摘要:很多前端同學在看到數據結構和算法后會有一定的抵觸心理,或者嘗試去練習,但是被難倒,從而放棄。本文選擇的數據結構和算法的類別均是出現頻率最高,以及應用最廣的類別。面試這是非常現實的一點,也是很多前端學習數據結構和算法的原因。 一、導讀 據我了解,前端程序員有相當一部分對數據結構和算法的基礎概念都不是很清晰,這直接導致很多人在看到有關這部分的內容就會望而卻步。 實際上,當你了解了數據結構和...
閱讀 1418·2021-09-22 15:52
閱讀 1458·2019-08-30 15:44
閱讀 895·2019-08-30 14:24
閱讀 2705·2019-08-30 13:06
閱讀 2700·2019-08-26 13:45
閱讀 2782·2019-08-26 13:43
閱讀 1014·2019-08-26 12:01
閱讀 1436·2019-08-26 11:56