zoukankan      html  css  js  c++  java
  • 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. }  
  • 相关阅读:
    ruby on rails入门基础
    医学界的一个阴谋——近视手术
    30岁前挣够500万
    学习数学的意义
    针对 NetBeans IDE 7.1 的 Ruby 开发插件发布
    人的一生
    Rails常用命令整理
    穷人为什么穷?富人为什么富?
    NetBeans的(默认)快捷键
    IT界那些性感的让人尖叫的程序员
  • 原文地址:https://www.cnblogs.com/xujian2014/p/4235262.html
Copyright © 2011-2022 走看看