華為上機題彙總(四)
注:編譯環境為Visual Studio 2012,答案僅供參考。
目錄
- 華為上機題彙總四
- 目錄
- 第十六題
- 第十七題
- 第十八題
- 第十九題
- 第二十題
第十六題
16.将一個字元串的元音字母複制到另一個字元串,并排序(30分)
問題描述:
有一字元串,裡面可能包含英文字母(大寫、小寫)、數字、特殊字元,現在需要實作一函數,将此字元串中的元音字母挑選出來,存入另一個字元串中,并對字元串中的字母進行從小到大的排序(小寫的元音字母在前,大寫的元音字母在後,依次有序)。
說明:
1、 元音字母是a,e,i,o,u,A,E,I,O,U。
2、 篩選出來的元音字母,不需要剔重;
最終輸出的字元串,小寫元音字母排在前面,大寫元音字母排在後面,依次有序。
要求實作函數:
void sortVowel (char* input, char* output);
【輸入】 char* input,表示輸入的字元串
【輸出】 char* output,排好序之後的元音字元串。
【傳回】 無
示例
輸入:char *input = “Abort!May Be Some Errors In Out System. “
輸出:char *output =“aeeeooouAEIO“
#include "stdafx.h"
#include <iostream>
using namespace std;
char oChars[] = {'a','e','i','o','u','A','E','I','O','U'};
int indexOfOChars(char c){
for (int i = ; i < ; i++)
{
if (c == oChars[i])
{
return i;
}
}
return -;
}
int cmp(const void *a, const void *b){
return indexOfOChars(*(char*)a) - indexOfOChars(*(char*)b);
}
void sortVowel (char* input, char* output){
char *p = output;
while (*input != '\0')
{
if (indexOfOChars(*input) != -)
{
*p++ = *input;
}
input++;
}
*p = '\0';
qsort(output,p-output,sizeof(char),cmp);
cout << output << endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
char *input = "Abort!May Be Some Errors In Out System. ";
char output[];
sortVowel(input,output);
return ;
}
第十七題
17.身份證号碼合法性判斷
問題描述:
我國公民的身份證号碼特點如下:
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) 輸入:”511002198902291234”,函數傳回值:7;
8) 輸入:”511002198808081234”,函數傳回值:0;
#include <iostream>
using namespace std;
int monthDays[] = {,,,,,,,,,,,};
bool isLeapYear(int year){
if (year % == )
{
if (year % == )
{
return true;
}
return false;
}
if (year % == )
{
return true;
}
return false;
}
int verifyIDCard(char* input){
int length = strlen(input);
if (length != )
{
return ;
}
for (int i = ; i < ; i++)
{
if ((input[i] < '0') || (input[i] >'9'))
{
return ;
}
}
if (((input[] < '0') || (input[] >'9')) && (input[] != 'x'))
{
return ;
}
int year = ;
int temp = ;
for (int i = ; i > ; i--)
{
year += (input[i] - '0') * temp;
temp *= ;
}
if ((year < ) || (year > ))
{
return ;
}
int month = ;
temp = ;
for (int i = ; i > ; i--)
{
month += (input[i] - '0') * temp;
temp *= ;
}
if (month < || month > )
{
return ;
}
int day = ;
temp = ;
for (int i = ; i > ; i--)
{
day += (input[i] - '0') * temp;
temp *= ;
}
if (isLeapYear(year))
{
monthDays[] = ;
}
else
{
monthDays[] = ;
}
if (day < || day > monthDays[month-])
{
return ;
}
return ;
}
int _tmain(int argc, _TCHAR* argv[])
{
char input[];
cin.getline(input,);
cout << verifyIDCard(input) << endl;
return ;
}
第十八題
18.識别字元串中的整數并轉換為數字形式(40分)
問題描述:
識别輸入字元串中所有的整數,統計整數個數并将這些字元串形式的整數轉換為數字形式整數。
要求實作函數:
void take_num(const char *strIn, int *n, unsigned int *outArray)
【輸入】 strIn: 輸入的字元串
【輸出】 n: 統計識别出來的整數個數
outArray:識别出來的整數值,其中outArray[0]是輸入字元串中從左到右第一個整數,
outArray[1]是第二個整數,以此類推。數組位址已經配置設定,可以直接使用
【傳回】 無
注:
I、 不考慮字元串中出現的正負号(+, -),即所有轉換結果為非負整數(包括0和正整數)
II、 不考慮轉換後整數超出範圍情況,即測試用例中可能出現的最大整數不會超過unsigned int可處理的範圍
III、 需要考慮 ‘0’ 開始的數字字元串情況,比如 “00035” ,應轉換為整數35;
“000” 應轉換為整數0;”00.0035” 應轉換為整數0和35(忽略小數點:mmm.nnn當成兩個數mmm和nnn來識别)
IV、 輸入字元串不會超過100 Bytes,請不用考慮超長字元串的情況。
示例
輸入:strIn = “ab00cd+123fght456-25 3.005fgh”
輸出:n = 6
outArray = {0, 123, 456, 25, 3, 5}
#include <iostream>
#include <string>
using namespace std;
void take_num(const char *strIn, int *n, unsigned int *outArray){
*n = ;
const char *ahead = strIn;
while (*strIn != '\0')
{
if ((*ahead < '0')||(*ahead > '9'))
{
ahead++;
strIn++;
continue;
}
while ((*ahead >= '0')&&(*ahead <= '9'))
{
*ahead++;
}
string intStr(strIn,ahead);
unsigned int number = stoi(intStr);
outArray[(*n)++] = number;
strIn = ahead;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
char* strIn = "ab00cd+123fght456-25 3.005fgh";
unsigned output[];
int i = ;
int *n = &i;
take_num(strIn,n,output);
cout << *n << endl;
for (int i = ; i < *n; i++)
{
cout << output[i] << endl;
}
return ;
}
第十九題
19.通過鍵盤輸入一串小寫字母(a~z)組成的字元串。請編寫一個字元串過濾程式,若字元串中出現多個相同的字元,将非首次出現的字元過濾掉。
比如字元串“abacacde”過濾結果為“abcde”。
示例
輸入:“deefd” 輸出:“def”
輸入:“afafafaf” 輸出:“af”
輸入:“pppppppp” 輸出:“p”
#include <iostream>
#include <string>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
string input,output;
getline(cin,input);
bool flags[];
for (int i = ; i < ; i++)
{
flags[i] = ;
}
for(auto begin = input.begin(),end = input.end();begin != end;begin++){
if (!flags[*begin])
{
flags[*begin] = ;
output.push_back(*begin);
}
}
cout << output << endl;
return 0;
}
第二十題
20.通過鍵盤輸入一串小寫字母(a~z)組成的字元串。請編寫一個字元串壓縮程式,将字元串中連續出席的重複字母進行壓縮,并輸出壓縮後的字元串。
壓縮規則:
1. 僅壓縮連續重複出現的字元。比如字元串”abcbc”由于無連續重複字元,壓縮後的字元串還是”abcbc”.
2. 壓縮字段的格式為”字元重複的次數+字元”。例如:字元串”xxxyyyyyyz”壓縮後就成為”3x6yz”
示例
輸入:“cccddecc” 輸出:“3c2de2c”
輸入:“adef” 輸出:“adef”
輸入:“pppppppp” 輸出:“8p”
#include <iostream>
#include <string>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
string input,output;
getline(cin,input);
for(auto begin = input.begin(),end = input.end();begin != end;begin++){
auto ahead = begin + ;
if (ahead == end)
{
output.push_back(*begin);
break;
}
while ((ahead != end)&&(*ahead == *begin))
{
*ahead++;
}
int count = ahead - begin;
if (count == )
{
output.push_back(*begin);
continue;
}
output += to_string(count);
output.push_back(*begin);
begin += count-;
}
cout << output << endl;
return ;
}