程序员面试经常碰到的题,欢迎大家补充

一个单向链表   1->2->3->4->5 把他变成 5->4->3->2->1 (要求不能改变节点的地址

  1. void resv_Linklist(Node* head)  
  2. {  
  3.     Node* a[3];  
  4.     a[0] = a[1] = NULL;  
  5.     a[2] = head;  
  6.     while(a[2]->next)  
  7.     {  
  8.         a[0] = a[1];  
  9.         a[1] = a[2];  
  10.         a[2] = a[2]->next;  
  11.         a[1]->next = a[0];  
  12.     }  
  13.     *head = *(a[2]);  
  14. }  

 

2给你一个 10进制的数 将其变成 2进制后会有多少个 1
   比如 “3 变成 2进制后 2 1”

 

Brian Kernighan 的算法,非常优美

C 代码

  1. unsigned int v; // count the number of bits set in v  
  2. unsigned int c; // c accumulates the total bits set in v  
  3. for (c = 0; v; c++)  
  4. {  
  5.   v &= v - 1; // clear the least significant bit set  
  6. }  

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 );

    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值