45. 【字符】合并字符串


成绩

5

开启时间

2022年10月24日 星期一 08:10

折扣

0.8

折扣时间

2022年11月13日 星期日 23:55

允许迟交


关闭时间

2022年11月22日 星期二 23:55


输入两个已经按从小到大顺序排列好的字符串,编写一个合并两个字符串的函数,使合并后的字符串,仍然是从小到 大排列。

输入:
两个已经排好顺序(升序)的两个字符串

输出:
一个合并在一起的有序(升序)的字符串

要求: 设计一个效率尽量高的算法,对每个字符串只扫描一遍就可以了。
如果采用先进行串连接,然后再进行排序的算法,则效率太低了。



 

测试输入

期待的输出

时间限制

内存限制

额外进程

测试用例 1

以文本方式显示



  1. abcdef↵
  2. bcefghi↵


以文本方式显示



  1. abbccdeeffghi↵


1秒

64M

0

测试用例 2

以文本方式显示



  1. 123456↵
  2. 789↵


以文本方式显示



  1. 123456789↵


1秒

64M

0

测试用例 3

以文本方式显示



  1. 789↵
  2. 12345↵


以文本方式显示



  1. 12345789↵


1秒

64M

0

测试用例 4

以文本方式显示



  1. 123456↵
  2. 123456↵


以文本方式显示



  1. 112233445566↵


1秒

64M

0

测试用例 5

以文本方式显示



  1. 123456↵


以文本方式显示



  1. 123456↵


1秒

64M

0

测试用例 6

以文本方式显示



  1. 123456↵


以文本方式显示



  1. 123456↵


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语言菜鸟一枚,代码不当或可以改进的地方欢迎大家讨论交流。