歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> 2012年華為校園招聘機試

2012年華為校園招聘機試

日期:2017/2/28 14:47:24   编辑:Linux教程

1. 手機號碼合法性判斷(20分)

問題描述:

我國大陸運營商的手機號碼標准格式為:國家碼+手機號碼,例如:8613912345678。特點如下:

1長度13位;

2以86的國家碼打頭;

3手機號碼的每一位都是數字。

請實現手機號碼合法性判斷的函數(注:考生無需關注手機號碼的真實性,也就是說諸如86123123456789這樣的手機號碼,我們也認為是合法的),要求:

1)如果手機號碼合法,返回0;

2)如果手機號碼長度不合法,返回1

3)如果手機號碼中包含非數字的字符,返回2;

4)如果手機號碼不是以86打頭的,返回3;

注除成功的情況外,以上其他合法性判斷的優先級依次降低。也就是說,如果判斷出長度不合法,直接返回1即可,不需要再做其他合法性判斷。int verifyMsinsdn(char *inMsisdn)

解:主要是思維的嚴謹性,一步一步的寫

int verifyMsinsdn(char *inMsisdn)

{
if(strlen(inMsisdn)!=13)
return 1;
for(int i=0;i<13;i++)
if(inMsisdn[i]<'0'||inMsisdn[i]>'9')
return 2;
if(inMsisdn[0]!='8'||inMsisdn[1]!='6')
return 3;
return 0;
}

2. 將一個字符串的元音字母復制到另一個字符串,並排序(30分)

問題描述:有一字符串,裡面可能包含英文字母(大寫、小寫)、數字、特殊字符,現在需要實現一函數,將此字符串中的元音字母挑選出來,存入另一個字符串中,並對字符串中的字母進行從小到大的排序(小寫的元音字母在前,大寫的元音字母在後,依次有序)。說明:

1:元音字母是a,e,i,o,u,A,E,I,O,U。

2:篩選出來的元音字母,不需要剔重;

3:最終輸出的字符串,小寫元音字母排在前面,大寫元音字母排在後面,依次有序。

void sortVowel (char* input, char* output);

解,基本算法,此題可以利用STL裡現成的算法

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
void sortVowel (char* input, char* output)
{
string tmpLow,tmpUpper;
for(char *p=input; *p!='\0';++p)
{
if('a'==*p||'e'==*p||'i'==*p||'o'==*p||'u'==*p)
tmpLow+=*p;
else if('A'==*p||'E'==*p||'I'==*p||'O'==*p||'U'==*p)
tmpUpper+=*p;
}
sort(tmpLow.begin(),tmpLow.end());
sort(tmpUpper.begin(),tmpUpper.end());
tmpLow+=tmpUpper;
strcpy(output,tmpLow.c_str());
}

3. 身份證號碼合法性判斷
問題描述:
我國公民的身份證號碼特點如下:
1:長度為18位;
2:第1~17位只能為數字;
3:第18位可以是數字或者小寫英文字母x。
4:身份證號碼的第7~14位表示持有人生日的年、月、日信息。
例如:511002198808080111或51100219880808011x。
請實現身份證號碼合法性判斷的函數。除滿足以上要求外,需要對持有人生日的年、月、日信息進行校驗。年份大於等於1900年,小於等於2100年。需要考慮閏年、大小月的情況。所謂閏年,能被4整除且不能被100整除 或 能被400整除的年份,閏年的2月份為29天,非閏年的2月份為28天。其他情況的合法性校驗,考生不用考慮。
函數返回值:
1) 如果身份證號合法,返回0;
2) 如果身份證號長度不合法,返回1;
3) 如果身份證號第1~17位含有非數字的字符,返回2;
4) 如果身份證號第18位既不是數字也不是英文小寫字母x,返回3;
5) 如果身份證號的年信息非法,返回4;
6) 如果身份證號的月信息非法,返回5;
7) 如果身份證號的日信息非法,返回6(請注意閏年的情況);
除成功的情況外,以上其他合法性判斷的優先級依次降低。也就是說,如果判斷出長度不合法,直接返回1即可,不需要再做其他合法性判斷。要求實現函數:int verifyIDCard(char* input)
輸入char* input,表示輸入的身份證號碼字符串

輸出無

返回 判斷的結果,類型為int
示例
1) 輸入:”511002111222”,函數返回值:1;
2) 輸入:”511002abc123456789”,函數返回值:2;
3) 輸入:”51100219880808123a”,函數返回值:3;
4) 輸入:”511002188808081234”,函數返回值:4;
5) 輸入:”511002198813081234”,函數返回值:5;
6) 輸入:”511002198808321234”,函數返回值:6;
7) 輸入:”511002198808081234”,函數返回值:0;
解:不作解釋,基本流程

#include<iostream>
#include<memory>
using namespace std;
int verifyIDCard(char* input)
{
if(strlen(input)!=18)
return 1;
for(char *p=input; p!=input+17;++p)
if(!isdigit(*p))
return 2;
if(!isdigit(input[17])&&input[17]!='x')
return 3;
char year[5]="",mon[3]="",date[3]="";
memcpy(year,input+6,4);
memcpy(mon,input+10,2);
memcpy(date,input+12,2);
if(atoi(year)<1900||atoi(year)>2100)
return 4;
if(atoi(mon)<1||atoi(mon)>12)
return 5;
if(4==atoi(mon)||6==atoi(mon)||9==atoi(mon)){
if(atoi(date)<1||atoi(date)>30)
return 6;
}
else
{
if(atoi(mon)==2)
{
if(atoi(year)%400==0)
{
if(atoi(date)<1||atoi(date)>29)
return 6;
}
else
if(atoi(date)<1||atoi(date)>28)
return 6;
}
else
if(atoi(date)<1||atoi(date)>31)
return 6;
}
return 0;
}

Copyright © Linux教程網 All Rights Reserved