第二次参加华为机试:
前两题没有难度,第一题应该是用STL的map,但我时间不够,只写了一部分,最后得分只有300(总分400,第一题的100分没拿到)。
第三题比较有趣:
题目给的背景是堆积木(我改了下背景),给你一些积木,它们宽和高相同但长度不同(有点类似于积木),要求把它们堆成地面墙。
从数学角度来说,就是:
给你一些数,它们可以两两相加,也可以单独一个数,要求它们组合成同一个数。
比如:
3 3 6 6
可以组合成3个6(两个6单独成一个数,两个3相加),也可以组合成2个9(6和3分别相加)。
然后要求最后能组合成相同的多少个数。
思路:(其实简单,相当于智力题,但当时我还是花了点时间才想明白,一开始以为是动态规划,后面以为是搜索,最终才想明白)
最终组合出来的数要么是最大的数,要么是最小的数和最大的数的和(仔细想想堆积木的时候是不是这样?)。
想通了这一点,题目就直接做出来了。
2021-11-13补充:
今天已经入职了,虽然是作为德科的od入职的。
其实之前机试的第一题在机试过后的一天便写出来了,但一直没有时间,那就现在补上吧。
题目大意是:
输入很多个字符串,你要把它们出现的次数记录下来,然后给你一个数字n的时候你要把出现次数前n多的字符串输出。
// URL select
#include
#include
#include
#include
#include
然后说下面试吧,第一次面试的时候没考虑到异常情况,翻车了,第二次的题目只是一个单纯的栈应用,比逆波兰式还要简单,是leetcode上的,过了。
那就补上第一次面试的代码吧。
题目大意是给你一些数字,把它们头尾拼接,要求输出最后值最大的。
我第一次失误是单纯的认为是字典序,没有考虑到:
3 32 34
这样的情况,字典序会输出34323
,正确结果应该是34332
#include
#include
#include
#include
#include
#include
// using namespace std;
bool cmp(std::string a,std::string b)
{
if(a.size()>b.size())
return !cmp(b,a);
int i;
for(i=0;i*a.size()b.substr(i*a.size(),a.size()))
return true;
return true;
}
int main(void)
{
std::vector v;
char s[100];
while(EOF!=scanf(" %s ",s))
{
v.push_back(s);
}
std::sort(v.begin(),v.end(),cmp);
for(std::vector::iterator it=v.begin();it!=v.end();it++)
{
printf("%s ",(*it).c_str());
}
return 0;
}