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