华为上机题汇总(四)

华为上机题汇总(四)

注:编译环境为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 = 0; i < 10; i++)
    {
        if (c == oChars[i])
        {
            return i;
        }
    }
    return -1;
}

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) != -1)
        {
            *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[100];
    sortVowel(input,output);
    return 0;
}

第十七题

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[12] = {31,28,31,30,31,30,31,31,30,31,30,31};

bool isLeapYear(int year){
    if (year % 100 == 0)
    {
        if (year % 400 == 0)
        {
            return true;
        }
        return false;
    }
    if (year % 4 == 0)
    {
        return true;
    }
    return false;
}

int verifyIDCard(char* input){
    int length = strlen(input);
    if (length != 18)
    {
        return 1;
    }

    for (int i = 0; i < 17; i++)
    {
        if ((input[i] < '0') || (input[i] >'9'))
        {
            return 2;
        }
    }

    if (((input[17] < '0') || (input[17] >'9')) && (input[17] != 'x'))
    {
        return 3;
    }

    int year = 0;
    int temp = 1;
    for (int i = 9; i > 5; i--)
    {
        year += (input[i] - '0') * temp;
        temp *= 10;
    }
    if ((year < 1900) || (year > 2100))
    {
        return 4;
    }

    int month = 0;
    temp = 1;
    for (int i = 11; i > 9; i--)
    {
        month += (input[i] - '0') * temp;
        temp *= 10;
    }
    if (month < 1 || month > 12)
    {
        return 5;
    }

    int day = 0;
    temp = 1;
    for (int i = 13; i > 11; i--)
    {
        day += (input[i] - '0') * temp;
        temp *= 10;
    }
    if (isLeapYear(year))
    {
        monthDays[1] = 29;
    }
    else
    {
        monthDays[1] = 28;
    }
    if (day < 1 || day > monthDays[month-1])
    {
        return 6;
    }
    return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
    char input[100];
    cin.getline(input,100);
    cout << verifyIDCard(input) << endl;
    return 0;
}

第十八题

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 = 0;
    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[100];
    int i = 0;
    int *n = &i;
    take_num(strIn,n,output);
    cout << *n << endl;
    for (int i = 0; i < *n; i++)
    {
        cout << output[i] << endl;
    }
    return 0;
}

第十九题

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[256];
    for (int i = 0; i < 256; i++)
    {
        flags[i] = 0;
    }
    for(auto begin = input.begin(),end = input.end();begin != end;begin++){
        if (!flags[*begin])
        {
            flags[*begin] = 1;
            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 + 1;
        if (ahead == end)
        {
            output.push_back(*begin);
            break;
        }
        while ((ahead != end)&&(*ahead == *begin))
        {
            *ahead++;
        }
        int count = ahead - begin;
        if (count == 0)
        {
            output.push_back(*begin);
            continue;
        }
        output += to_string(count);
        output.push_back(*begin);
        begin += count-1;
    }
    cout << output << endl;
    return 0;
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值