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;
}
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;
}
相关文章推荐
- 2014 华为校招机试题(c/c++开发类)
- 2014华为校招机试题-车辆调度
- 华为2014校招机试题
- 2012华为软件机试题 浅析 --------------------C/C++ 西安交大考点
- 华为2013校招广州机试题
- 华为2014年机试题【字符串压缩】-【C语言/C++】
- 2014华为机试题-字符串压缩
- 【2014校招】华为南研所机试
- C++面试试题大全,包括华为、雅虎等企业
- 华为2014校园招聘机试题
- 2014华为校招机试高级题——if语法中的括号判断
- [置顶] 华为2014校招机试
- HDU 2516 取石子游戏 (斐波那契博弈)---华为2014校招机试第三题
- 2014华为机试试题1——反转相加(2013.09.11)
- 华为2014年机试题【字符串过滤】-【C语言/C++】
- 2012华为软件机试题 浅析(二) ------------------C/C++ 西安交大考点
- 每K个元素翻转一次链表,若最后剩余元素不足K个,不进行翻转(美团2014校招试题)
- 2014华为武汉上机试题规范
- 【2014华为机试题】01.字符串右补齐
- [历年IT笔试题]2014京东校园招聘软件开发类笔试试题