天天看點

華為上機題彙總(四)華為上機題彙總(四)

華為上機題彙總(四)

注:編譯環境為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 ;
}
           

繼續閱讀