找工作之面试题练习2

来源:互联网 发布:淘宝代销怎么刷销量 编辑:程序博客网 时间:2024/04/30 05:11
 实现一个函数,对一个正整数n,算得到1需要的最少操作次数:
  如果n为偶数,将其处以2; 如果n为奇数,可以加1或减1;  一直处理下去。
  例子:
  ret = func(7);
  ret = 4,可以证明最少需要4次运算
  n = 7
  n—1 6
  n/2 3
  n-1 2
  n/2 1
  要求:实现函数(实现尽可能高效)
  Int func(unsign int n);n为输入,返回最小的运算次数。
  给出思路(文字描述),完成代码,并分析你算法的时间复杂度。


//第一种实现int func2(const unsigned int n){if(1 == n){return 0;}if(2 == n){return 1;}if(n % 2 == 0){return 1 + func2(n / 2);}else{int plus = func2(n + 1);int mines = func2(n - 1);return 1 + (plus < mines ? plus : mines);}return 0;}//第二种实现int func3(unsigned long n){if(n == 1)return 0;if(n == 3)return 2;if(n%2 == 0){return 1 + func3(n/2) ;}else{if((n+1)%4 == 0)return 3 + func3((n+1)/4);if((n-1)%4 == 0)return 3 + func3((n-1)/4);}return 0;}int func6(const unsigned int n){if(1 == n)return 0;if(3 == n)return 2;if(!(n & 0x01))return 1 + func6(n >> 1);else{if(!((n + 1) & 0x03))return 3 + func6((n + 1) >> 2);if(!((n - 1) & 0x03))return 3 + func6((n - 1) >> 2);}return 0;}//第三种实现int func_iterative(unsigned int n){int step = 0;while(n != 1 && n != 3){if( !(n & 0x01)){n >>= 1;++step;}else{if(!((n + 1) & 0x03)){++n;++step;}else if(!((n - 1) & 0x03)){--n;++step;}}}if(3 == n)step += 2;return step;}



//最新添加-----实验室大牛的又一改进版本

int func(const unsigned int n){    if(1 == n)    {        return 0;    }    if(3 == n)    {        return 2;    }    if(!(n & 0x01))    {        return 1 + func(n >> 1);    }    else    {        return 3 + (!((n + 1) & 0x03) ? func((n + 1) >> 2) : func(n >> 2));    }    return 0;}




原创粉丝点击