2012年9月初,华为就已经开始机试了,在南京这个算最早的了,准备了几天机试,发现题目不难,但是要考虑多个特例.
举个例子:给一组整型数,让你求大于等于平均值的数集合.乍看一下,题目很简单,只要求出平均数不就可以了,但是,要注意这个平均数的类型,要用实型,很容易就直接当做int处理了,那么就错了;
还有个例子,判断给定某数是否为2的幂次,2,8,16这些都是,我们会很想当然的使用!(x&(x-1))来判断,但是,有没有想过给定的数要大于0才有意义?因此,小题才见真功夫。
当天考的3道题,
第一道题是扑克牌的排序,即输入[A,J,K,Q,2] 输出[2 A K Q J] ,其中A K Q J 分别用整形数1 13 12 11表示。不难,我先做了过滤将2 和 A 变换为 15 14 排序好了之后再 过滤回 2 和 A。
第二道题是约瑟夫环,编号1~m的m个人排成一圈,每次按照n报数出列,求最后出列的一个人最初的编号是什么,不难,但是很多人都没有看到卷子上有个注意点,当输入异常,返回-1,因此要判断m,n是否为正常输入。
第三道题是求几个字符串中的公共子串,如给定string[] .让你求这些字符串中最长的公共子串,如
string s1="there is a local bus";
string s2="local bus is good for us";
string s3="he is like to go by local bus";
返回local bus
这个给出程序:
#include <iostream>
#include <string>
using namespace std;
string findLCS(const string sa,const string sb);
int main()
{
string s1="there is a local bus";
string s2="local bus is good for us";
string s3="he is like to go by local bus";
cout<<"最长子串"<<findLCS(s3,findLCS(s1,s2))<<endl;
cin.get();
}
string findLCS(const string sa,const string sb)
{
string temp;
//默认sa的长度比sb短
const string *pa=&sa,*pb=&sb;
if (sa.length()>sb.length())
{
pa=&sb;pb=&sa;
}
int lena=pa->length();
for (int i=lena;i>0;i--)
{
for (int j=0;j<lena-1;j++)
{
if(i+j<=lena)
{
temp=pa->substr(j,i);
int n=pb->find(temp);
if (n>=0)
return temp;
}
}
}
}