1 一个单向链表 1->2->3->4->5 把他变成 5->4->3->2->1 (要求不能改变节点的地址 )
- void resv_Linklist(Node* head)
- {
- Node* a[3];
- a[0] = a[1] = NULL;
- a[2] = head;
- while(a[2]->next)
- {
- a[0] = a[1];
- a[1] = a[2];
- a[2] = a[2]->next;
- a[1]->next = a[0];
- }
- *head = *(a[2]);
- }
2给你一个 10进制的数 将其变成 2进制后会有多少个 1
比如 “3 变成 2进制后 是 2个 1”
是 Brian Kernighan 的算法,非常优美
C 代码
- unsigned int v; // count the number of bits set in v
- unsigned int c; // c accumulates the total bits set in v
- for (c = 0; v; c++)
- {
- v &= v - 1; // clear the least significant bit set
- }
此循环的循环次数和 v 里面 1 的数量一样多,如 11000 ,会循环两次, 11000&10111, 10000&01111 ,最终 c+2
3一个人上楼梯 可以有两种方式 ‘一次上一阶 ’和 ‘一次上两阶 ’
问题: 有一个 10阶的楼梯 他有几种方式上去?
补充: 如果楼梯是 1阶 ,他有一种上法(一次上一阶);如果楼梯是两阶他有 2中上法 (一次上一阶上 2次和一次上 2阶上一次 );如果楼梯是 3阶,他有 3种上法( 1+2, 1+1+1, 2+1)
此题实际为斐波那契额数列,可以想象成这样:
1)假设迈的最后一步是一个台阶则可能的上法有f(n-1)种
2)假设迈的最后一步是两个台阶则可能的上法有f(n-2)种
所以f(n)=f(n-1)+f(n-2)
TInt CmytestAppUi::Fibonacci ( TInt n )
{
if ( n <= 2)
{
return n;
}
return Fibonacci ( n - 1 ) + Fibonacci ( n - 2 );
}