9.2 合并字符串
本文已被浏览3103次
今天起,本网站将会晒出Jerry提供的知码开门上的参考答案,注意,不要照抄哦!今天先为大家解析9.2 合并字符串这一题,再次声明,不要照抄!
9.2 合并字符串
题目是:给出两个按照ASCII大小顺序从小到大进行排列的字符串,将两个字符串合并并保持ASCII从小到大的顺序排列(禁用:冒泡排序)
根据测试用例和题目的描述,可以看出来,我们需要的程序就是用来把两个字符串中的字符打乱然后重新进行排序(这种算法被题目禁掉了没有试试他有没有被系统禁掉,如果出现在ACM上,提交后肯定就是超时的提示).
从测试用例中可以看出来,输入的每一个数据都是已经排好序的了,那么我们就不必再排序,而是直接就进行交叉合并即可,那么就可以通过按次序比较前后进行合并即可:
Step 0:当然Input
Step 1:取出Box1第一个字符和Box2第二个字符
Step 2:取出这两个字符中ASCII较小的一个存入最后的结果
Step 3:继续从Box1/2中取出一个(从取走的那个Box中取)
Step 4:重复2进行比较
Step N:Output
这便是其中的算法,通过一个一个的比较排序,从而省去了打乱字符之后到恢复字符相对顺序的过程.以下是C语言脚本
/**********版权声明************** 本博客展出的代码均为Jerry原创,转载请注明 严禁使用本博客的内容代替作业,算法可以借鉴 但不要连变量名都不改的就抄走! *******************************/ //引入头文件 #include <stdio.h> #include <stdlib.h> //这一个必要不是很大,主要是用于调试时输出system("pause"),system("cls")之类的东西 int main(){ //定义变量 char S1[10]={0},S2[10]={0},add[20]={0}; int S1L=0,S2L=0,i=0,j=0,curr=0,NewCh; //把字符以字符串形式直接读入 scanf("%s",&S1); scanf("%s"&S2); //计算每个字符串有多少字 for(S1L=0;S1[S1L]!=0;S1L++); for(S2L=0;S2[S2L]!=0;S2L++); /*开一个循环 注意:由于计数变量有两个,所以最后一个表达式不写 当j和i都比两个字符串长度小时,即还剩余字符,此时要继续转移字符到add中,所以用或 */ for(i=0,j=0;i<S1L||j<S2L;){ if(i==S1L){ //当i=S1L时,即S1字符转移完毕,只转移S2中的内容即可 add[curr]=S2[j]; j++; curr++; }else if(j==S2L){ //同上 add[curr]=S1[i]; i++; curr++; }else{ //当两个字符串均有剩余字符时,采用依次比较剩余字符的第一个字符的方法进行比较 if(S1[i]<S2[j]){ //当S1中的第一字符比S2中第一字符靠前时,先转移S1中的第一个字符 add[curr]=S1[i]; curr++; i++; }else if(S1[i]>S2[j]){ //反之,如果S2考前,那么转移S2 add[curr]=S2[j]; curr++; j++; }else{ //如果相同,为了减少循环次数,一次转移两个,如果只转移其中一个也可以 add[curr]=S1[i]; curr++; add[curr]=S2[j]; curr++; i++; j++; } } } //开一个循环,依次显示add中的字符 for(i=0;i<curr;i++){ printf("%c",add[i]); } printf("n"); //或者直接使用printf("%sn");可以省掉一个printf //额啊,不写难受的return return 0; } /**********程序员是有信仰的********** * ━━━━━━神兽出没━━━━━━ * ┏┓ ┏┓ * ┏┛┻━━━┛┻┓ * ┃ ┃ * ┃ ━ ┃ * ┃ ┳┛ ┗┳ ┃ * ┃ ┃ * ┃ ┻ ┃ * ┃ ┃ * ┗━┓ ┏━┛Code is far away from bug with the animal protecting * ┃ ┃ 神兽保佑,代码无bug * ┃ ┃ * ┃ ┗━━━┓ * ┃ ┣┓ * ┃ ┏┛ * ┗┓┓┏━┳┓┏┛ * ┃┫┫ ┃┫┫ * ┗┻┛ ┗┻┛ * * ━━━━━━感觉萌萌哒━━━━━━ */
为了保证代码的正确性,再此贴出AC的截图:
评论
您需要 先登录 才可以回复.