2014 华为校招机试题(c/c++开发类)

第一题

1、2、3.。。。n盏灯,同时有n个人,

第1个人将1的倍数的灯拉一下,

第2个人将2的倍数的灯拉一下,

......

问最后有几盏灯是亮的,

初始状态下灯是灭的,

输入整数n(n<65536),

输出亮的灯数

 

方法解析:设置一个map,关键字为灯的编号,值为0或1,分别表示灯灭和灯亮状态,遍历map,第i个灯,将所有i倍数的灯进行一次取反操作,也可以通过数组实现。代码如下:

 

[cpp] view plaincopy
 
  1. #include "stdafx.h"  
  2. #include <iostream>  
  3. #include <vector>  
  4. #include <map>  
  5. using namespace std;  
  6. int count1(int n)      
  7. {  
  8.     vector<int> vec(65536, 0);  
  9.     for (int i = 1; i <= n; i++)  
  10.     {  
  11.         for (int j = 1; j <= n;j++)  
  12.         {  
  13.             if (j%i== 0)  
  14.                 vec[j - 1] = !vec[j - 1];;  
  15.         }  
  16.     }  
  17.     int sum = 0;  
  18.     for (int j = 0; j < n; j++)  
  19.     {  
  20.         if (vec[j] != 0)      //统计灯泡亮着的个数    
  21.             sum++;  
  22.     }  
  23.     return sum;  
  24. }  
  25.   
  26. int count2(int n)        
  27. {  
  28.     map<int, int> m;  
  29.     for (int i = 1; i <= n; i++)      //初始化map  
  30.         m.insert({ i, 0 });  
  31.     for (int j = 1; j <= n; j++)  
  32.     {  
  33.         for (auto it = m.begin(); it != m.end(); it++)  
  34.         {  
  35.             if (it->first%j == 0)  
  36.                 it->second = !(it->second);  
  37.         }  
  38.     }  
  39.     int sum = 0;  
  40.     for (auto it = m.begin(); it != m.end(); it++)  
  41.     if (it->second == 1)  
  42.         sum++;  
  43.     return sum;  
  44. }  
  45. int count3(int n)        
  46. {  
  47.     int sum = 0;  
  48.     bool a[65536] = { 0 };  
  49.     for (int i = 1; i <= n; i++)    //通过两嵌套循环模拟N个人一次拉灯    
  50.     {  
  51.         for (int j = 1; j <= n; j++)  
  52.         {  
  53.             if (j % i == 0)  
  54.             {  
  55.                 a[j - 1] = !a[j - 1];   
  56.             }  
  57.         }  
  58.     }  
  59.     for (int j = 0; j < n; j++)  
  60.     {  
  61.         if (a[j] != 0)      //统计灯泡亮着的个数    
  62.             sum++;  
  63.     }  
  64.     return sum;  
  65. }  
  66. int _tmain(int argc, _TCHAR* argv[])  
  67. {  
  68.     int number1 = count1(100);  
  69.     cout << number1 << endl;  
  70.     return 0;  
  71. }  

 

第二题

输入整数(n是小于9位数的整数),当作字符串处理,看是否有相同的子串,如1212,相同子串是12,141516没有子串(子串必须大于等于2),若有相同子串则输出1,否则输出0,

输入:长度小于9的整数

输出:1或0

 

方法解析:一开始考虑这道题时大脑短路,老是把长度为2、3、4的子串情况单独考虑,后来才想到只要保证有长度为2的子串相同即可。另外,对于string类型的成员函数substr()参数有些遗忘,这个函数的两个参数分别表示子串的起始位置和子串长度。实现代码如下:

 

[cpp] view plaincopy
 
  1. #include "stdafx.h"  
  2. #include <string>  
  3. #include <iostream>  
  4. using namespace std;  
  5. int fun1(string &s)      //方法一:用字符数组来解决  
  6. {  
  7.     int i = 0, j;  
  8.     int res = 0;  
  9.     for (i = 2; i < s.size() - 1; i++)           
  10.     {  
  11.         for (j = i - 1; j >= 0; j--)             
  12.         {                                      
  13.             if (s[i] == s[j] && s[i + 1] == s[j + 1])  
  14.             {  
  15.                 res = 1;              
  16.                 break;  
  17.             }  
  18.         }  
  19.         if (res == 1)  
  20.             break;  
  21.     }  
  22.     return res;  
  23. }  
  24. int fun2(string &s)    //方法二:用string类型的子串来判断  
  25. {  
  26.     int flag = 0;  
  27.     for (int i = 0; i < s.size()-1; i++)  
  28.     {  
  29.         for (int j = i + 2; j < s.size()-1; j++)  
  30.         {  
  31.             if (s.substr(i,2) == s.substr(j,2))  
  32.             {  
  33.                 flag = 1;  
  34.                 break;  
  35.             }  
  36.             if (flag)  
  37.                 break;  
  38.         }  
  39.     }  
  40.         return flag;  
  41. }  
  42. int _tmain(int argc, _TCHAR* argv[])  
  43. {  
  44.     string s = "13214121";  
  45.     cout <<fun1(s) << endl;  
  46.     cout<<fun2(s)<<endl;  
  47.     return 0;  
  48. }  
posted @ 2015-01-20 09:36  温布利往事  阅读(664)  评论(0编辑  收藏  举报