面试准备
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 }