您的位置:首页 > 编程语言 > C语言/C++

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

2015-01-20 09:36 441 查看
第一题

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

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

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

......

问最后有几盏灯是亮的,

初始状态下灯是灭的,

输入整数n(n<65536),

输出亮的灯数

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

[cpp] view plaincopy

#include "stdafx.h"

#include <iostream>

#include <vector>

#include <map>

using namespace std;

int count1(int n)

{

vector<int> vec(65536, 0);

for (int i = 1; i <= n; i++)

{

for (int j = 1; j <= n;j++)

{

if (j%i== 0)

vec[j - 1] = !vec[j - 1];;

}

}

int sum = 0;

for (int j = 0; j < n; j++)

{

if (vec[j] != 0) //统计灯泡亮着的个数

sum++;

}

return sum;

}

int count2(int n)

{

map<int, int> m;

for (int i = 1; i <= n; i++) //初始化map

m.insert({ i, 0 });

for (int j = 1; j <= n; j++)

{

for (auto it = m.begin(); it != m.end(); it++)

{

if (it->first%j == 0)

it->second = !(it->second);

}

}

int sum = 0;

for (auto it = m.begin(); it != m.end(); it++)

if (it->second == 1)

sum++;

return sum;

}

int count3(int n)

{

int sum = 0;

bool a[65536] = { 0 };

for (int i = 1; i <= n; i++) //通过两嵌套循环模拟N个人一次拉灯

{

for (int j = 1; j <= n; j++)

{

if (j % i == 0)

{

a[j - 1] = !a[j - 1];

}

}

}

for (int j = 0; j < n; j++)

{

if (a[j] != 0) //统计灯泡亮着的个数

sum++;

}

return sum;

}

int _tmain(int argc, _TCHAR* argv[])

{

int number1 = count1(100);

cout << number1 << endl;

return 0;

}

第二题

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

输入:长度小于9的整数

输出:1或0

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

[cpp] view plaincopy

#include "stdafx.h"

#include <string>

#include <iostream>

using namespace std;

int fun1(string &s) //方法一:用字符数组来解决

{

int i = 0, j;

int res = 0;

for (i = 2; i < s.size() - 1; i++)

{

for (j = i - 1; j >= 0; j--)

{

if (s[i] == s[j] && s[i + 1] == s[j + 1])

{

res = 1;

break;

}

}

if (res == 1)

break;

}

return res;

}

int fun2(string &s) //方法二:用string类型的子串来判断

{

int flag = 0;

for (int i = 0; i < s.size()-1; i++)

{

for (int j = i + 2; j < s.size()-1; j++)

{

if (s.substr(i,2) == s.substr(j,2))

{

flag = 1;

break;

}

if (flag)

break;

}

}

return flag;

}

int _tmain(int argc, _TCHAR* argv[])

{

string s = "13214121";

cout <<fun1(s) << endl;

cout<<fun2(s)<<endl;

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: