北理工乐学C语言 45.合并字符串

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秒64M0
测试用例 2以文本方式显示
  1. 123456↵
  2. 789↵
以文本方式显示
  1. 123456789↵
1秒64M0
测试用例 3以文本方式显示
  1. 789↵
  2. 12345↵
以文本方式显示
  1. 12345789↵
1秒64M0
测试用例 4以文本方式显示
  1. 123456↵
  2. 123456↵
以文本方式显示
  1. 112233445566↵
1秒64M0
测试用例 5以文本方式显示
  1. 123456↵
以文本方式显示
  1. 123456↵
1秒64M0
测试用例 6以文本方式显示
  1. 123456↵
以文本方式显示
  1. 123456↵
1秒64M0
#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语言菜鸟一枚,代码不当或可以改进的地方欢迎大家讨论交流。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值