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

来源:互联网 发布:windows 组播测试工具 编辑:程序博客网 时间:2024/05/20 15:10

一个单向链表 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进制后 21”

 

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 setin 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+21+1+12+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 );

    }

 

原创粉丝点击