2019年成渝地区华为实习生笔试第1题

前两天的华为成渝实习上机题,第一次上机考试,也没上网查什么的,真正靠自己编,加上考试的紧张,真的脑袋混乱,也暴露了很多基础问题。拿第一题C++出来说一下当时自己的基础问题。图片和思路来自ZY兄弟

#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main()
{
	/* erase删除第一个元素,pop_back删除最后一个元素
    size()指容器当前拥有的元素个数;
	capacity()指容器在必须分配存储空间之前可以存储的元素总数。*/
	int getnum,maxlen=0,i=0,count=0,num=0;
	cin >> getnum;
	string temp;
	vector<string> zq;
	while (cin >> temp)
		zq.push_back(temp);
	//求数组最长长度
	for (int i=0;i<zq.size();i++)
	{
		if (maxlen < zq[i].size())
			maxlen = zq[i].size();
	}
	//求轮询数组次数
	if (maxlen % (getnum * 2) == 0)
		count = maxlen / (getnum * 2);
	else
		count = maxlen / (getnum * 2) + 1;
	//开始输出
	for (int k = 0; k < count; k++)//轮询遍数
	{
		for (int j = 0; j < zq.size(); j++)//轮询几个数组
		{
			if ((zq[j].size() < getnum * 2) && (zq[j].size() > 0))//如果轮询到的数组元素数量不足getnum,则全部输出
			{
				cout << zq[j];
				zq[j].erase(0, zq[j].size());//输出后删除元素
				num++;
				if (num != zq.size())//最后一个输出的后面不加逗号
					cout << ',';
			}
			else if (zq[j].size() == 0)
				;
			else//如果轮询到的数组元素数量足够,则输出相应
			{
				for (int i = 0; i < getnum * 2; i++)
					cout << zq[j][i];
				zq[j].erase(0,getnum*2);//输出后删除元素
			}
		}
	}
	cout << endl;
	system("pause");
	return 0;
}

区区几十行,两个小时还是各种BUG。还要多加油,多上机刷题。
1.了解了容器vector插入、从头、尾部删除,以及对size、capacity等知识;
2.对题目应该有一个思路,要清晰,比如这题可以先求轮询次数等;
3.对循环输入的了解,刚考试真的没有想到while,也因为自己早就忘了文件结束符;
剩余问题:
1.题目要求将结果存在新数组,就不再赋值了;
2.题目的示例中,没有显示Ctrl+Z文件结束符,当时也是因为这个想不到该怎么结束输入。

以上代码只能支持一位数,数组元素是多位数的话,我暂时想到利用逗号做标志,判断元素个数后再输出。优化后代码为:

#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
	int getnum, elementnum[10] = {},maxnum=0,times=0,num=0,coutnum=0;
	string temp;
	cin >> getnum;
	vector<string> zq;
	while (cin >> temp)
		zq.push_back(temp);
	for (int i = 0; i < zq.size(); i++)
	{
			elementnum[i] = count(zq[i].begin(), zq[i].end(), ',') + 1;
		if (maxnum < elementnum[i])
			maxnum = elementnum[i];//元素个数为逗号个数+1
	}
	//求轮询数组次数
	if (maxnum % getnum  == 0)
		times = maxnum / getnum ;
	else
		times = maxnum / getnum + 1;
	//开始输出
	for (int k = 0; k < times; k++)//轮询遍数
	{
		for (int j = 0; j < zq.size(); j++)//轮询几个数组
		{
			if ((elementnum[j] <= getnum) && (elementnum[j] > 0))//如果轮询到的数组元素数量不足getnum,则全部输出
			{
				cout << zq[j];
				zq[j].erase(0, zq[j].size());//输出后删除元素
				if (zq[j].size() > 0)
					elementnum[j] = count(zq[j].begin(), zq[j].end(), ',') + 1;//更新数组元素数量
				else
					elementnum[j] = 0;
				num++;
				if (num < zq.size())//最后一个输出的后面不加逗号
					cout << ',';
			}
			else if (elementnum[j] == 0)
				;
			else//如果轮询到的数组元素数量足够,则输出相应
			{
				int size = zq[j].size();
				for (int commanum=0; coutnum < size; coutnum++)
				{
					cout << zq[j][coutnum];
					if (zq[j][coutnum] == ',')
						commanum++;
					if (commanum == getnum)
						break;
				}
				zq[j].erase(0, coutnum+1);//输出后删除元素
				elementnum[j] = count(zq[j].begin(), zq[j].end(), ',') + 1;//更新数组元素数量
				coutnum = 0;
			}
		}
	}
	cout << endl;
	system("pause");
	return 0;
}

全部评论

相关推荐

我见java多妩媚:大外包
点赞 评论 收藏
分享
评论
1
收藏
分享
牛客网
牛客企业服务