今日面試

問題1:

n級階梯,每次走一步或兩步,問最多有多少種走法 。
很早以前做過,然後忘了。。。。
解法思維:求n階,如果最後走一步,那麼就要求n-1階,如果最後走兩步,那麼就要求n-2階,所以n階就是求n-1階的解法+(n-2)的解法
所以解法:f(n)=f(n-1)+f(n-2)

public int count( int n){
	if(n == 1){
		return 1;
	}else if(n == 2){
		return 2;
	}
	return count(n-1)+count(n-2)
}

問題2 然後求一個鏈表有沒有環

最開始以爲是一個圖的問題,求環,深度優先遍歷。。。(然後就回答的不會,尷尬。)
結果回來搜索答案,是一個腦筋急轉彎。
思路很簡單:設置兩個指針,一個走的快,一個走的慢,如果有環,那麼總有一個時刻會相遇。
假定:單鏈表的長度爲n,且單鏈表爲環裝,那麼第n次迭代的時候,慢的指針走到i mod n,快的指針走到 2i mod n;
當i mod n == 2i mod n 那麼就說明相遇了。然後說明就有環

問題3 如何翻轉一個鏈表

  1. 因爲原來沒有去思考過這個問題,我當時的給出的解決方案是,利用雙向列表,用空間複雜度換取時間複雜度。
  2. 回家的路上想到了用棧來解決這個問題,保證了結構的不變性,但是浪費了空間和時間
  3. 回來查到的答案,利用三去實現該問題,設計思路也很巧妙。

    翻轉的問題是在於,能找到任意節點。

    1. 首先拎出頭指針指向一個空的節點,最後去指向尾結點
    2. 其次先建一個指針A指向一個空節點,第二個節點指向該節點,並設立指針BC。
    3. ABC依次交替,保證節點不丟失,能找到。就ok了.
    public void reverse(int[] arr){
    	Node A = head.next;
    	Node B = A.next;
    	Node C = A.next
    	Node head_pointer = head.next;
    	Node aux = new Node();
    	aux = A.next;
    	for(int i = 1;i<arr.length-1;i++){
    		C =C.next;
    		A = B.next;
    		A = B;
    		B = C;
    		
    	}
    }
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章