2012年 华为机试题

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

}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章