首页 > 技术文章 > 机试题

7ants 2013-07-02 21:17 原文

//问题描述: 
//在给定字符串中查找所有特定子串并删除,如果没有找到相应子串,则不作任何操作。
//要求实现函数: 
//int delete_sub_str(const char *str, const char *sub_str, char *result_str)
//【输入】 str:输入的被操作字符串
//         sub_str:需要查找并删除的特定子字符串
//【输出】 result_str:在str字符串中删除所有sub_str子字符串后的结果
//【返回】 删除的子字符串的个数
//注:
//I、   子串匹配只考虑最左匹配情况,即只需要从左到右进行字串匹配的情况。比如:
//在字符串"abababab"中,采用最左匹配子串"aba",可以匹配2个"aba"字串。如果
//匹配出从左到右位置2开始的"aba",则不是最左匹配,且只能匹配出1个"aba"字串。
//II、  输入字符串不会超过100 Bytes,请不用考虑超长字符串的情况。
//示例 
//输入:str = "abcde123abcd123"
//sub_str = "123"
//输出:result_str = "abcdeabcd"
//返回:2
// 
//输入:str = "abcde123abcd123"
//sub_str = "1234"
//输出:result_str = "abcde123abcd123"
//返回:0
using namespace std;

int delete_sub_str(const char* str, const char *sub_str, char *result_str)
{
    int total = 0; //总共有多少匹配字符串
    int sub_length = strlen(sub_str);
    int length = strlen(str);
    char temp[100] = {0};
    while(*str)
    {
        memcpy(temp,str,sub_length);
        if(strcmp(temp,sub_str) != 0)
            *result_str++ = *str++;
        else
        {
            str = str + sub_length;
            total++;
        }
    }
    *result_str = '\0';
    return total;
}

 

//问题描述:
//我国大陆运营商的手机号码标准格式为:国家码+手机号码,例如:8613912345678。特点如下:
// 
//1、 长度13位;
//2、 以86的国家码打头;
//3、 手机号码的每一位都是数字。
// 
//请实现手机号码合法性判断的函数(注:考生无需关注手机号码的真实性,也就是说诸如86123123456789这样的手机号码,我们也认为是合法的),要求:
//1) 如果手机号码合法,返回0;
//2) 如果手机号码长度不合法,返回1
//3) 如果手机号码中包含非数字的字符,返回2;
//4) 如果手机号码不是以86打头的,返回3;
//【注】除成功的情况外,以上其他合法性判断的优先级依次降低。也就是说,如果判断出长度不合法,直接返回1即可,不需要再做其他合法性判断。
//要求实现函数:
//int verifyMsisdn(char* inMsisdn)
//【输入】 char* inMsisdn,表示输入的手机号码字符串。
//【输出】  无
//【返回】  判断的结果,类型为int。
//示例
//输入:  inMsisdn =“869123456789“
//输出:  无
//返回:  1
//输入:  inMsisdn =“88139123456789“
//输出:  无
//返回:  3
//输入:  inMsisdn =“86139123456789“
//输出:  无
//返回:  0
int verifyMsisdn(char *inMsisdn)
{
    if(strlen(inMsisdn) / sizeof(char) != 13)
        return 1;
    int i = 13;
    while(--i)
    {
        if(isdigit(inMsisdn[i]) == 0)
            return 2;
    }
    if(inMsisdn[0] != '8' || inMsisdn[1] != '6')
        return 3;
    return 0;
}

 

//问题描述:
//有一字符串,里面可能包含英文字母(大写、小写)、数字、特殊字符,现在需要实现一函数,将此字符串中的元音字母挑选出来,存入另一个字符串中,并对字符串中的字母进行从小到大的排序(小写的元音字母在前,大写的元音字母在后,依次有序)。
// 说明:
//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 =“aeeeooAEIO“
int cmp(const void *a, const void *b)
{
    return *(char*)a - *(char *)b;
}

void sortVowel(char * input, char * output)
{    
    char * tempA = (char*)malloc(sizeof(char)*100);
    char * tempa = (char*)malloc(sizeof(char)*100);
    int i = 0;
    int j = 0;
    while(*input)
    {
        if(*input == 'a' || *input == 'e' || *input == 'i' || *input == 'o' || *input == 'u')
            tempa[i++] = *input;
        if(*input == 'A' || *input == 'E' || *input == 'I' || *input == 'O' || *input == 'U')
            tempA[j++] = *input;
        input++;
    }
    tempa[i] = '\0';
    tempA[j] = '\0';
    qsort(tempa,strlen(tempa),sizeof(char),cmp);
    qsort(tempA,strlen(tempA),sizeof(char),cmp);
    strcpy(output,tempa);
    strcat(output,tempA);
}

 

//请实现身份证号码合法性判断的函数。除满足以上要求外,需要对持有人生日的年、月、日信息进行校验。年份大于等于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;

int verifyIDCard(char * input)
{
    int i = 17;
    int year, month, day;
    if(strlen(input) != 18)
        return 1;
    while(--i)
    {
        if(isdigit(input[i] == 0))
            return 2;
    }
    if(input[17] != 'x' && isdigit(input[17]) == 0)
        return 3;
    year = (input[6]-48)*1000 + (input[7]-48) * 100 + (input[8]-48) * 10 + (input[9]-48);
    month = (input[10]-48) * 10 + (input[11]-48);
    day = (input[12]-48) * 10 + (input[13]-48);
    if(year > 2100 || year < 1900)
        return 4;
    if(month > 12 || year < 1)
        return 5;
    if((month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) && (day<1 || day > 31))
        return 6;
    else if((month == 4 || month == 6 || month == 9 || month == 11) && (day < 1 || day > 30))
        return 6;
    else if(month == 2 && (day < 1 || day > 29))
        return 6;
    if(!((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) && month == 2 && day == 29)
        return 6;
    return 0;
}

 

//给定一个字符串,实现一个函数,按下述方式输出字符串: * 如果此字符的下一个字符和此字符不一样,原样输出此字符,
//否则先输出此字符,再输出此字符连续出现的次数(次数不大于9)。
//例如,字符串ABBCCCDEDFFF,输出的结果为AB2C3DEDF3。 * * 不用考虑溢出问题,不能使用任何I/O函数

void change_str(char * str)
{
    int src_pos = 0;
    int des_pos = 0;
    char * result_str = (char *)malloc(sizeof(str));
    while(str[src_pos])
    {
        int count = 49;
        result_str[des_pos++] = str[src_pos++];
        while(str[src_pos] == result_str[des_pos - 1])
        {
            src_pos++;
            count++;
        }
        if(count > 49)
            result_str[des_pos++] = count;
    }
    //result_str[des_pos] = '\0';
    strcpy(str,result_str);
}

 

//1、选秀节目打分,分为专家评委和大众评委,score[]数组里面存储每个评委打的分数,
//judge_type[]里存储与 score[]数组对应的评委类别,judge_type[i] == 1,表示专家评委,
//judge_type[i] == 2,表示大众评委,n表示评委总数。打分规则如下:专家评委和大众评委
//的分数先分别取一个平均分(平均分取整),然后,总分 = 专家评委平均分  * 0.6 + 大众评委 * 0.4,
//总分取整。如果没有大众评委,则总分 =专家评委平均分,总分取整。函数最终返回选手得分。
// 
//       函数接口   int cal_score(int score[], int judge_type[], int n)

int cal_score(int score[], int judge_type[], int n)
{
    int pro_num = 0;
    int unpro_num = 0;
    int i;
    int total_score = 0;
    int pro_score = 0;
    int unpro_score = 0;
    for(i = 0; i<n; i++)
    {
        if(judge_type[i] == 1)
        {
            pro_score += score[i];
            pro_num++;
        }
        else if(judge_type[i] == 2)
        {
            unpro_score += score[i];
            unpro_num++;
        }
    }
    if(unpro_num == 0)
        return pro_score / pro_num;
    else
        return (pro_score / pro_num) * 0.6 + (unpro_score / unpro_num) * 0.4;
}
//2、给定一个数组input[],如果数组长度n为奇数,则将数组中最大的元素放到
//output[]数组最中间的位置,如果数组长度n为偶数,则将数组中最大的元素放到
//output[]数组中间两个位置偏右的那个位置上,然后再按从大到小的顺序,依次在
//第一个位置的两边,按照一左一右的顺序,依次存放剩下的数。
//例如:input[] = {3, 6, 1, 9, 7}   output[] = {3, 7, 9, 6, 1};             input[] = {3, 6, 1, 9, 7, 8}    output[] = {1, 6, 8, 9, 7, 3}
//函数接口   void sort(int input[], int n, int output[]

int cmp(const void * a, const void * b)
{
    return *(int *)b - *(int *)a;
}

void sort(int input[], int n, int output[])
{
    qsort(input,n,sizeof(int),cmp);
    output[n / 2] = input[0];
    int i = 1;
    while(i < n)
    {
        if(i % 2 == 1)
            output[n / 2 - i / 2 - 1 ] = input[i];
        else
            output[n / 2 + i / 2 ] = input[i];
        i++;
    }
}

 

//3、操作系统任务调度问题。操作系统任务分为系统任务和用户任务两种。
//其中,系统任务的优先级 < 50,用户任务的优先级 >= 50且 <= 255。
//优先级大于255的为非法任务,应予以剔除。现有一任务队列task[],长度为n,
//task中的元素值表示任务的优先级,数值越小,优先级越高。函数scheduler实现
//如下功能,将task[] 中的任务按照系统任务、用户任务依次存放到 system_task[] 数组
//和 user_task[] 数组中(数组中元素的值是任务在task[] 数组中的下标),并且优先
//级高的任务排在前面,优先级相同的任务按照入队顺序排列(即先入队的任务排在前面),
//数组元素为-1表示结束。
//例如:task[] = {0, 30, 155, 1, 80, 300, 170, 40, 99}    system_task[] = {0, 3, 1, 7, -1}    user_task[] = {4, 8, 2, 6, -1}
//函数接口    void scheduler(int task[], int n, int system_task[], int user_task[])

void sort(int input[], int n)
{
    int i,j;
    for(i = 0; i<n; i++)
    {
        for(j = 0; j<n-i-1; j++)
        {
            if(input[j] > input[j+1])
            {
                int temp = input[j];
                input[j] = input[j+1];
                input[j+1] = temp;
            }
        }
    }
}

void scheduler(int task[], int n, int system_task[], int user_task[])
{
    sort(task,n);
    for(int k = 0; k<n; k++)
    {
        cout<<task[k]<<" ";
    }
    cout<<endl;
    int i = 0;
    int j = 0;
    int k = 0;
    while(task[i] < 50)
        system_task[k++] = task[i++];
    while(task[i] >= 50 && task[i] <= 255)
        user_task[j++] = task[i++];
    system_task[k] = -1;
    user_task[j] = -1;
}

 

//1.       给定一个字符串,把字符串内的字母转换成该字母的下一个字母,a换成b,z换成a,Z换成A,如aBf转换成bCg,字符串内的其他字符不改变,给定函数,编写函数
//void  Stringchang(const  char*inpu,char*output)
//其中input是输入字符串,output是输出字符串
void stringchange(const char *input, char *output)
{
    while(*input)
    {
        if((*input >= 'a' && *input <= 'y') || (*input <= 'Y' && *input >= 'A'))
            *output++ = *input++ + 1;
        else if(*input == 'z' || *input == 'Z')
            *output++ = *input++ - 25;
        else
            *output++ = *input++;
    }
    *output = '\0';
}

 

推荐阅读