C语言本题要求编写程序,将给定字符串去掉重复的字符后,按照字符ASCII码顺序从小到大排序后输出。 输入格式: 输入是一个以回车结束的非空字符串(少于80个字符)。 输出格式: 输出去重排序后的结果字符串。 输入样例: ad2f3adjfeainzzzv 输出样例: 23adefijnvz
时间: 2024-03-23 11:42:16 浏览: 57
入一个字符,再输入一个以回车结束的字符串(少于80个字符)在字符串中查找该字符。.cpp
好的,这道题目可以使用桶排序的思想解决,具体实现如下:
```c
#include <stdio.h>
#include <string.h>
#define MAX_LEN 80
#define BUCKET_SIZE 128
int main() {
char str[MAX_LEN + 1];
int bucket[BUCKET_SIZE] = {0}; // 初始化桶
int len, i, j;
// 读入字符串
fgets(str, MAX_LEN + 1, stdin);
len = strlen(str) - 1; // 减去回车符的长度
// 统计每个字符出现的次数
for (i = 0; i < len; i++) {
bucket[str[i]]++;
}
// 输出去重排序后的结果字符串
for (i = 0; i < BUCKET_SIZE; i++) {
if (bucket[i] > 0) {
putchar(i); // 输出当前字符
bucket[i]--; // 计数器减1
// 如果当前字符还有剩余,则继续输出
while (bucket[i] > 0) {
putchar(i);
bucket[i]--;
}
}
}
return 0;
}
```
代码中,我们首先定义了一个桶 `bucket`,用来统计每个字符出现的次数。由于 ASCII 码一共只有 128 个字符,因此桶的大小设置为 128。
接下来,我们读入字符串,并依次遍历字符串中的每个字符,更新桶中对应字符的计数器。
最后,我们再次遍历桶中的每个字符,如果当前字符的计数器大于 0,则输出该字符,并将计数器减 1。如果当前字符还有剩余,则继续输出,直到计数器为 0。
上述代码的时间复杂度为 $O(n)$,其中 $n$ 是字符串的长度。由于桶的大小为常数,因此空间复杂度为 $O(1)$。
阅读全文