嗯,昨天晚上笔试华为。还是没有一个全通过,感觉第一题应该能全过的,不过结果却不如人意。不过总体来说都算有了一定的结果。
第一题leetcode05题,输入字符串,输出最大的回文字符串。具体的算法描写05题有写,不过不需要输出字符串,只需要输出字符串的长度。但是05题的代码只能够通过一部分40%的例子,不知道为什么,理论上应该没有问题的,主要考试也不给例题,所以输出的什么例子有问题也无法知道,所以没有办法再优化问题。然后还写了一个另一种解法,不过只过了20%。程序如下:
#include <iostream> #include <string> using namespace std; int LargestString(string s){ if(s.size()==0) return 0; int i=0; int j=s.size()-1; int answer=0; while(i<j){ while(s[i]!=s[j]){ --j; } while(i<j&&s[i++]==s[j--]){ answer+=2; } if(i<j&&s[i]!=s[j]){ answer=0; continue; } } return answer; } int main(){ string s; while(cin>>s){ int i=LargestString(s); cout<<i<<endl; } return 0; }
该算法的问题,早上想了想可能主要问题出在i没有控制++在循环的内部,当出现将answer置零情况时,未对i和j做出相对应的改变。然后就是05题的算法,具体可以参考
点击打开链接中我所分析的算法,但是调试的时候竟然只通过40%就很奇怪,而且最奇怪的时我改变返回参数,对反参的answer+1的时候依然能够通过40%。但+2的时候则为0%。主要没给测试案例,就很难判断主要问题出在哪里。(难道是有特殊字符?)
总体算来算是业务代码吧,比较实用,和算法的关系不是很大,但是对于做过前端或者说时有自己搭建系统的同学来说这部分应该会比较熟悉。总体题目比较长,但是其主要实现的是对不同字段的IPV6的地址信息进行一个判断,主函数使用一个switch对不同的情况进行输出。而功能函数则是对不同输入的字符串进行判断,代码如下:
#include <iostream> #include <string> using namespace std; int DifferentType(string s){ if(s.size()==0||s.size()>39) return 0; if(s=="::") return 1; if(s=="::1") return 2; string tmp=s.substr(0,4); if(tmp=="FE80") return 3; if(tmp=="FEC0") return 4; if(tmp=="FF00") return 6; else return 5; } int main(){ string s; while(cin>>s){ switch(DifferentType(s)){ case 1: cout<<"Unspecified"<<endl; case 2: cout<<"Lookback"<<endl; case 3: cout<<"LinkLocal"<<endl; case 4: cout<<"SiteLocal"<<endl; case 5: cout<<"GlobalUnicast"<<endl; case 6: cout<<"Multicast"<<endl; case 0: cout<<"Error"<<endl; } } return 0; }这是最开始的雏形,由于通过率不高所以又在后面进行了优化,主要针对主函数没有break,且对于中间段代码的判断不是很精准,最后输出代码:
#include <iostream> #include <string> using namespace std; int DifferentType(string s){ if(s.size()==0||s.size()>39) return 0; if(s=="::") return 1; if(s=="::1") return 2; string tmp=s.substr(0,2); string tmp1=s.substr(0,3); if(tmp1=="FE8"||tmp1=="FE9"||tmp1=="FEA"||tmp1=="FEB") return 3; if(tmp=="FE") return 4; if(tmp=="FF") return 6; else return 5; } int main(){ string s; while(cin>>s){ switch(DifferentType(s)){ case 1: cout<<"Unspecified"<<endl; break; case 2: cout<<"Lookback"<<endl; break; case 3: cout<<"LinkLocal"<<endl; break; case 4: cout<<"SiteLocal"<<endl; break; case 5: cout<<"GlobalUnicast"<<endl; break; case 6: cout<<"Multicast"<<endl; break; case 0: cout<<"Error"<<endl; } } return 0; }
最后通过57%,嗯,到底还是没有及格来着。
第三题 不好意思忘了存了。。大概是个最优解的问题。而且只通过20%,不过代码没存,就交给各位自己解决啦
总体来说华为实习生的笔试题难度相对于网易和阿里来说难度不是很大,但是还是需要有清晰的思路和解法。对于特殊情况要有所考虑。如果出现只通过一部分而无法通过全部的情况真的有点难受来着,毕竟没有测试案例。。。真的没有修改思路啊。论测试工程师测试案例的重要性,hahaha!