45. 【字符】合并字符串
成绩 | 5 | 开启时间 | 2022年10月24日 星期一 08:10 |
折扣 | 0.8 | 折扣时间 | 2022年11月13日 星期日 23:55 |
允许迟交 | 否 | 关闭时间 | 2022年11月22日 星期二 23:55 |
输入两个已经按从小到大顺序排列好的字符串,编写一个合并两个字符串的函数,使合并后的字符串,仍然是从小到 大排列。
输入:
两个已经排好顺序(升序)的两个字符串
输出:
一个合并在一起的有序(升序)的字符串
要求: 设计一个效率尽量高的算法,对每个字符串只扫描一遍就可以了。
如果采用先进行串连接,然后再进行排序的算法,则效率太低了。
| 测试输入 | 期待的输出 | 时间限制 | 内存限制 | 额外进程 |
测试用例 1 |
|
| 1秒 | 64M | 0 |
测试用例 2 |
|
| 1秒 | 64M | 0 |
测试用例 3 |
|
| 1秒 | 64M | 0 |
测试用例 4 |
|
| 1秒 | 64M | 0 |
测试用例 5 |
|
| 1秒 | 64M | 0 |
测试用例 6 |
|
| 1秒 | 64M | 0 |
#include<stdio.h>
#include<string.h>
int main(void)
{
int i, j, count1 = 0, count2= 0, lx, ly;
char x[100] = { 0 }, y[100] = { 0 };
scanf("%s", &x);
scanf("%s", &y);
lx = strlen(x);
ly = strlen(y);
for (i = 0; i < ly; i++)
{
for (j = count1; j < lx; j++) //x中从count1开始的所有数依次与y中的每一个数比较,输出较小者(count1下面有说明)
{
if (x[j] <= y[i])
{
printf("%c", x[j]);
count1++; /*统计数组x比数组y小的数的个数count1,下次再进入内层for循环时(既y中数变大了)不用再从头开始,而直接从循环结束的地方开始。
举个例子,abcd和bceg,a和b比输出a,b和b比输出b,c和b比输出b,break,内层for结束,此时count1为2;
接着要和y[1]比,即c比,就只用从x[count1]即c开始比,因为前面两个数比y[0]小,那肯定比y[1]小。*/
}
else
{
printf("%c", y[i]);
count2++; //同理count1,即y中比x中任意数都小的个数
break;
}
}
if (count1 == lx)
break;//在这里退出是因为:对x中的任意数,y中都有更大的,但上面的算法并不能输出较大值;同时计算出count2的值
}
if (count1 == lx)//上述运算结果只有两种:要么数组x全比完,要么数组y全比完,故需要把剩下的大数输出,这也是引入count的意义
{
for (i = count2; i < ly; i++)
{
printf("%c", y[i]);
}
}
if (count2 == ly)
{
for (j == count1; j < lx; j++)
{
printf("%c", x[j]);
}
}
printf("\n");
return 0;
}
本人C语言菜鸟一枚,代码不当或可以改进的地方欢迎大家讨论交流。