//问题描述: //在给定字符串中查找所有特定子串并删除,如果没有找到相应子串,则不作任何操作。 //要求实现函数: //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'; }