今日面试

问题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;
    		
    	}
    }
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章