面试准备

1、实现一个函数,对一个正整数n,算得到1需要的最少操作次数。操作规则为:如果n为偶数,将其除以2;如果n为奇数,可以加1或减1;一直处理下去。

例子:
func(7) = 4,可以证明最少需要4次运算
n = 7
n-1 6
n/2 3
n-1 2
n/2 1
要求:实现函数(实现尽可能高效) int func(unsign int n);n为输入,返回最小的运算次数。给出思路(文字描述),完成代码,并分析你算法的时间复杂度。

要想到位操作,除以2,分析下,就可以。

 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 int func(unsigned int n)
 6 {
 7     int count = 0;
 8     while(1 != n)
 9     {
10         if(n & 1)
11         {
12             if(3 == (n & 3) && 3 != n)
13                 n += 1;
14             else n -= 1;
15             count ++;
16         }
17         n >>= 1;
18         count ++;
19     }
20     return count;
21 }
22 int main()
23 {
24     int n;
25     while(cin >> n)
26     {
27         int count = func(n);
28         cout << count << endl;
29     }
30     return 0;
31 }

 

 2.改变部分bit数,例如src = 0xabc ,改变4到7位,val = 0xd,则src = 0xadc;

位操作都不熟悉了。

 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 typedef unsigned int UINT;
 6 // assume 32 bits integer
 7 void ChangePartBits(UINT  & src, UINT bit_high, UINT bit_low, UINT val)
 8 {
 9      if(bit_high < bit_low || bit_high > 31) return;
10     UINT temp = 0x0;
11     for(UINT i = bit_low; i <= bit_high; ++i)
12     {
13         temp <<= 1;
14         temp |= 0x1;
15     }
16     temp <<= bit_low;
17     temp = ~temp;
18     src &= temp;
19     val <<= bit_low;
20     src |= val;
21 }
22 
23 int main()
24 {
25     UINT src = 0xabc, val = 0xd;
26     UINT bit_high = 7, bit_low = 4;
27     ChangePartBits(src, bit_high, bit_low, val);
28     cout << hex << src << endl;
29     return 0;
30 }

 3.输入格式:第一行输入N(N<=100)表示流通的纸币面额数量;第二行N个纸币的具体表示的面额,从小到大排列,取值【1,10^6】。
输出格式:输出一个整数,表示应该发行的纸币面额,这个整数是已经发行的所有纸币面额都无法表示的最小整数。(已经发行的每个纸币面额最多只能使用一次)

例子:

5

1 2 3 9 100

7

写代码要美啊,找到最好的思路,写最简洁易懂,结构清楚的代码。

 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 int GetMiniInt(int n)
 6 {
 7     if(n <= 0) return 0;
 8     int * data = new int[n];
 9     for(int j = 0; j < n; ++j)
10         cin >> data[j];
11     int before = 0;
12     for(int i = 0; i < n; ++i)
13     {
14         if(data[i] > before+1)
15             break;
16         else before += data[i];
17     }
18     delete []data;
19     return before + 1;
20 }
21 int main()
22 {
23     int n;
24     while(cin >> n)
25         cout << GetMiniInt(n) << endl;
26     return 0;
27 }

 

 

posted @ 2012-09-21 16:40  可乐爱上了雪碧  阅读(204)  评论(0编辑  收藏  举报