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