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

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用以下代码实现: ```c #include <stdio.h> #include <string.h> int main() { char str1[100], str2[100]; int len, i; // 输入两个字符串 printf("请输入两个字符串:\n"); fgets(str1, sizeof(str1), stdin); fgets(str2, sizeof(str2), stdin); // 去掉换行符 len = strlen(str2); if (str2[len - 1] == '\n') { str2[len - 1] = '\0'; } // 将字符串str2倒置 len = strlen(str2); for (i = 0; i < len / 2; i++) { char temp = str2[i]; str2[i] = str2[len - i - 1]; str2[len - i - 1] = temp; } // 将倒置后的字符串str2和字符串str1连接起来 strcat(str1, str2); // 输出连接后的字符串str1 printf("连接后的字符串为:%s\n", str1); return 0; } ``` 其中,我们使用 `fgets` 函数从标准输入读取两个字符串,并且去掉了换行符。然后,我们使用一个 `for` 循环将第二个字符串倒置。最后,使用 `strcat` 函数将倒置后的第二个字符串和第一个字符串连接起来,输出连接后的字符串。 ### 回答2: #include <stdio.h> #include <string.h> void reverseString(char* str) { int left = 0; int right = strlen(str) - 1; while (left < right) { char temp = str[left]; str[left] = str[right]; str[right] = temp; left++; right--; } } int main() { char str1[100]; char str2[100]; printf("请输入字符串str1:"); fgets(str1, sizeof(str1), stdin); printf("请输入字符串str2:"); fgets(str2, sizeof(str2), stdin); // 删除str1和str2中的换行符 str1[strlen(str1) - 1] = '\0'; str2[strlen(str2) - 1] = '\0'; reverseString(str2); strcat(str1, str2); printf("连接后的字符串为:%s\n", str1); return 0; } ### 回答3: 可以使用C语言字符串函数和循环结构实现将字符串str2倒置后接在字符串str1后面的功能。 首先,需要在程序中引入字符串头文件`string.h`。 然后,定义两个字符数组`str1`和`str2`,分别用于存储输入的两个字符串。 接下来,使用`gets()`函数分别输入`str1`和`str2`的值。 然后,使用`strlen()`函数分别获取`str1`和`str2`的长度。 接着,使用一个循环结构,从`str2`的最后一个字符开始,逆序将每个字符复制到`str1`的末尾位置,即将`str2`倒置。 最后,使用下标i和j分别指向`str1`和`str2`的末尾位置,最后将字符串结束符`\0`复制到`str1`的下一个位置,即可完成两个字符串的拼接操作。 具体的程序实现如下: ```c #include <stdio.h> #include <string.h> int main() { char str1[100], str2[100]; int len1, len2; int i, j; printf("请输入字符串str1:"); gets(str1); printf("请输入字符串str2:"); gets(str2); len1 = strlen(str1); len2 = strlen(str2); for(i = len1, j = len2 - 1; j >= 0; i++, j--) { str1[i] = str2[j]; } str1[i] = '\0'; printf("合并后的字符串为:%s\n", str1); return 0; } ``` 以上程序可以实现将两个字符串倒置后拼接在一起,最终输出合并后的字符串

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值