题目描述
编写一个程序,从键盘接收一个字符串,然后按照字符顺序从小到大进行排序,并删除重复的字符。
输入
输入一个字符串。
输出
输出按字符(ASCII)顺序从小到大排序,且无重复字符的字符串。
样例输入
badacgegfacb
样例输出
abcdefg
思路
其实就是三大块,输入,排序,输出。
输入代码框架已经给出了一半,只需要将字符存入数组即可。
然后进行排序,用的是经典的冒泡排序,老知识了。
最后输出,输出时使用一个变量last存储前一次输出的字符,若相同则跳过当前字符。
即若有字符数组str存字符串“abbc”,首先输出str[0],即’a’,然后last存入‘a’,然后从i=1开始循环。
i=1,str[i]为’b’,last为‘a’,不相同,所以输出‘b’,输出后更新last为’b’。
i=2,str[i]为’b’,last为‘b’,相同,所以不输出。
i=3,str[i]为’c’,last为‘b’,不相同,所以输出‘c’,输出后更新last为’c’。
错误代码
c = getchar()后使用gets(a),但是未对c进行处理,导致第一个字符缺失。
#include <stdio.h>
#include <string.h>
int main()
{
char a[100], c, min1, min2, max;
int i = 0, k, n = 0;
while ((c = getchar()) != EOF)
{
int j;
gets(a);
n = strlen(a);
for (i = 0; i < n; i++)
{
for (j = 0; j < n - 1 - i; j++)
{
if (a[j] > a[j + 1])
{
max = a[j];
a[j] = a[j + 1];
a[j + 1] = max;
}
}
for (j = 0; j < n - 1; j++)
{
if (a[j] == a[j + 1])
{
for (k = j; k < n - 1; k++)
{
a[k + 1] = a[k + 2];
}
}
}
}
printf("%s", a);
}
printf("\n");
return 0;
}
参考代码
为了显得更加简略直观,删去了框架中未用到的变量。
#include <stdio.h>
int main()
{
char str[100], c;
int num = 0;
// 从标准输入读取字符,直到遇到EOF(文件结束符)
while ((c = getchar()) != EOF)
{
str[num] = c;
num++;
}
// 冒泡排序,将字符数组按照ASCII顺序从小到大排序
for (int i = 0; i < num; i++)
{
for (int j = num - 1; j > i; j--)
{
if (str[j] < str[j - 1])
{
// 交换数组元素
int temp = str[j];
str[j] = str[j - 1];
str[j - 1] = temp;
}
}
}
char last = str[0]; // 用来存储前一个输出的字符
printf("%c", str[0]);
// 遍历排序后的字符数组,输出不重复的字符
for (int i = 1; i < num; i++)
{
if (str[i] != last)
{
// 如果当前字符和前一个字符不相等,则输出并更新last
printf("%c", str[i]);
last = str[i];
}
}
printf("\n");
return 0;
}
(by 归忆)