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

第一题

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

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

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

......

问最后有几盏灯是亮的,

初始状态下灯是灭的,

输入整数n(n<65536),

输出亮的灯数


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

#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()参数有些遗忘,这个函数的两个参数分别表示子串的起始位置和子串长度。实现代码如下:

#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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值