C++题目--合并字符串

【问题描述】

从键盘输入两个有序字符串(其中字符按ASCII码从小到大排序,并且不含重复字符),将两字符串合并,要求合并后的字符串仍是有序的,并且重复字符只出现一次,最后输出合并后的结果。

【输入形式】

分行从键盘输入两个有序字符串(每个字符串不超过50个字符)

【输出形式】

输出合并后的有序字符串

【输入样例】

abcdeg
bdfh

【输出样例】

abcdefgh

【样例说明】

输入两个有序字符串abcdegbdfh,输出合并后的有序字符串为abcdefgh


对于这道题我的思路是:利用两个库函数:sort()unique(),先排序,再去重,用unique()拿到排序后的去重后的第一个重复数据的下标,将前面的不重复数据输出即可

对于sort()unique() 不熟悉的,可以参考文章:
sort(): C++排序函数sort
unique():

  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 下面是一个可能的实现: ```cpp char* str_bin(char* str1, char* str2) { int len1 = strlen(str1); int len2 = strlen(str2); int i = len1 - 1, j = len2 - 1; int k = len1 + len2 - 1; while (i >= 0 && j >= 0) { if (str1[i] > str2[j]) { str1[k--] = str1[i--]; } else { str1[k--] = str2[j--]; } } while (j >= 0) { str1[k--] = str2[j--]; } return str1; } ``` 该函数首先计算出两个字符串的长度,然后从后往前遍历两个字符串,比较当前位置的字符大小,将较大的字符放到合并后的字符串的末尾,然后继续向前遍历。最后,如果第二个字符串还有剩余字符,就把它们全部复制到合并后的字符串的开头。最后返回合并后的字符串。由于该函数直接修改了第一个字符串,因此不需要额外分配内存来存储结果。 ### 回答2: 使用C语言编写一个函数char * str_bin(char* str1, char* str2),实现将有序字符串str2合并有序字符串str1中,合并后的字符串仍保持有序。 ```c #include<stdio.h> #include<string.h> char* str_bin(char* str1, char* str2) { int len1 = strlen(str1); // 获取str1长度 int len2 = strlen(str2); // 获取str2长度 int len = len1 + len2; // 计算合并字符串的长度 char* merged_str = malloc(len + 1); // 为合并字符串分配内存 int i = 0, j = 0, k = 0; // 初始化索引 // 依次比较两个字符串中的字符,将较小的字符添加到合并后的字符串 while (i < len1 && j < len2) { if (str1[i] < str2[j]) { merged_str[k++] = str1[i++]; } else { merged_str[k++] = str2[j++]; } } // 将剩余的字符添加到合并后的字符串 while (i < len1) { merged_str[k++] = str1[i++]; } while (j < len2) { merged_str[k++] = str2[j++]; } merged_str[k] = '\0'; // 在字符串末尾添加结束符 // 将合并后的字符串复制回str1 strcpy(str1, merged_str); free(merged_str); // 释放内存 return str1; } int main() { char str1[100] = "aabccf"; char str2[100] = "bcddfg"; printf("Before merging: %s\n", str1); str_bin(str1, str2); printf("After merging: %s\n", str1); return 0; } ``` 这段代码实现了从有序字符串str2合并有序字符串str1中,合并后的字符串仍然保持有序有序字符串合并过程通过比较两个字符串中的字符,将较小的字符添加到合并后的字符串中,直到其中一个字符串遍历完。然后,将剩余的字符添加到合并后的字符串中。最后,将合并后的字符串复制回str1,并释放合并字符串的内存。在示例中,输入的两个字符串为"aabccf"和"bcddfg",合并后的字符串为"aabbcccddfg"。通过调用str_bin函数可以实现这个功能。 ### 回答3: 可以通过以下方式编写函数char * str_bin(char* str1, char* str2)来实现题目要求: 1. 首先计算两个字符串的长度,分别用len1和len2来表示。 2. 创建一个新的字符数组result,长度为len1 + len2 + 1,多出的1用来存放字符串结束符'\0'。 3. 创建三个指针,分别指向str1、str2和result的末尾位置,分别用ptr1、ptr2和ptr3来表示。 4. 从末尾开始遍历,比较ptr1和ptr2所指向的字符ASCII码大小,将较大的字符复制到result的末尾,并将对应指针往前移动一位。 5. 循环执行步骤4直到ptr1或ptr2指针到达字符串的开头。 6. 如果还有字符剩余,将剩余字符复制到result的起始位置。 7. 最后,将result的起始地址返回。 以下是对应的C代码实现: ```c #include <stdio.h> #include <string.h> char * str_bin(char* str1, char* str2) { int len1 = strlen(str1); int len2 = strlen(str2); char* result = (char*)malloc((len1 + len2 + 1) * sizeof(char)); char* ptr1 = str1 + len1 - 1; char* ptr2 = str2 + len2 - 1; char* ptr3 = result + len1 + len2; *ptr3 = '\0'; while (ptr1 >= str1 && ptr2 >= str2) { if (*ptr1 >= *ptr2) { *ptr3 = *ptr1; ptr1--; } else { *ptr3 = *ptr2; ptr2--; } ptr3--; } while (ptr1 >= str1) { *ptr3 = *ptr1; ptr1--; ptr3--; } while (ptr2 >= str2) { *ptr3 = *ptr2; ptr2--; ptr3--; } return result; } int main() { char str1[] = "abcdef"; char str2[] = "cefghi"; char* result = str_bin(str1, str2); printf("合并后的字符串为:%s\n", result); free(result); return 0; } ``` 假设str1和str2分别为"abcdef"和"cefghi",则合并后的字符串为"abccdeefghi"。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值