问题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 如何翻转一个链表
- 因为原来没有去思考过这个问题,我当时的给出的解决方案是,利用双向列表,用空间复杂度换取时间复杂度。
- 回家的路上想到了用栈来解决这个问题,保证了结构的不变性,但是浪费了空间和时间
- 回来查到的答案,利用三去实现该问题,设计思路也很巧妙。
翻转的问题是在于,能找到任意节点。
- 首先拎出头指针指向一个空的节点,最后去指向尾结点
- 其次先建一个指针A指向一个空节点,第二个节点指向该节点,并设立指针BC。
- 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; } }