本题要求编写程序,将给定字符串去掉重复的字符后,按照字符ASCII码顺序从小到大排序后输出。
输入格式:
输入是一个以回车结束的非空字符串(少于80个字符)。
输出格式:
输出去重排序后的结果字符串。
输入样例:
ad2f3adjfeainzzzv
输出样例:
23adefijnvz
解题过程
乍一看挺难的事实上转换一下逻辑看上去就还好
但我确实有顾虑,关于做n个循环会不会超出限制和有没有更简单的方式比较字符与输出
因为我的代码风格是倾向于多线程 也就是一次完成多个任务 所以我会选择在读取字符的同时进行选择排序,并且比较已有字符;如果有重复就continue并进入下一次循环
选择排序L2-1【例7-5①】 选择法排序_l2-1【例7-5①】 选择法排序 分数 20 全屏浏览 切换布局 作者 c课程组 单位 浙江-CSDN博客
因为我曾经就有纠结数组的整体后移或前移情况 刚好这次如果使用选择排序就可以用上 但是情况不太一样,因为上次的是数字输出有一个固定的范围,而这次不一样,所以整体后移就不太适用,但是如果稍微修改变为整体旋转似乎就可以适用于这种情况
而且上一次的数组是定义的数字,如果需要使用还需改为char类型
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
#include <string.h>void swi(char a[], int b, int c) {/*整体右旋转函数swi(数组,int起始数组下标,int结束下标)*/int temp = a[c];for (int i = c-1; i >= b; i--) {a[i + 1] = a[i];}a[b] = temp;
}int main() {char s[114];char c;int n;for (int i = 0;; i++) {c = getchar();if (c == '\n')break;s[i] = c;for (int j = 0; j < i; j++) {//排序if (c < s[j]) {swi(s, j, i);s[j] = c;break;}if (c == s[j]) {//是否重复i--;break;}}s[i + 1] = '\0';//化为字符串以使用puts()输出}puts(s);
}