解题思路:
我的思路就是使用一个数组来储存每一个字符出现的次数,最后判断对应位置上的数组元素是否为1(因为删除的重复元素且不相邻的也算),例如:先设两个数组 char a[101]; int b[101](b的初始值全都为0);a用来储存输入的字符串,b用来判断字符串每一个位置上的字符串出现的次数。看下面例子:
a="432112",遍历这个字符串:第一个元素是4,那把b的4号位的元素加一(即0+1=1);第2个元素是3,那么把b数组3号位的元素加1;第3个元素把b数组2号位元素值加一,第4个元素是1把b数组的1号位元素值加一,第5个元素是1,把b数组的1号位元素加一(注意此时b数组的1号位元素值为2,因为前面加过一次了);后面原理一样。最终a、b数组的元素如下;
元素 下标 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
字符串a | 4 | 3 | 2 | 1 | 1 | 2 | \0 | ||
数组b | 2 | 2 | 1 | 1 |
上面表格得出;不重复的元素只有3 4(因为出现次数均为1)
注意事项:
注意b数组的的含义
参考代码:
#include <cstdio> #include <cstdlib> #include <iostream> #include <cmath> #include <cctype> #include <cstring> #include <string> #include <stack> #include <algorithm> #include <functional> using namespace std; const int maxn=1<<8; char p[maxn]; int str[maxn]; int main() { fgets(p, maxn, stdin); for(int i = 0, len = strlen(p); i < len; ++i) { str[p[i]]++; //统计每一个字符出现的次数 } for(int i = 0, len = strlen(p); i < len; ++i) //遍历字符串输出只出现1次的字符 { if(str[p[i]] == 1) { printf("%c", p[i]); } } printf("\n"); return 0; }
或许有人数,题目要求要用指针,其实用数组来做本质上就是操作指针的,那么我在给一个指针的代码:
(注意数组和指针的异同,数组名不能用自增自减运算符,因为-- ++作用的对象是左值)
#include <cstdio> #include <cstdlib> #include <iostream> #include <cmath> #include <cctype> #include <cstring> #include <string> #include <stack> #include <algorithm> #include <functional> using namespace std; const int maxn=1<<8; char p[maxn]; int str[maxn]; int main() { fgets(p, maxn, stdin); for(int i = 0; *(p+i); ++i) //注意不要用++p { str[*(p+i)]++; } for(int i = 0; *(p+i); ++i) { if(str[*(p+i)] == 1) { printf("%c", *(p+i)); } } printf("\n"); return 0; }
0.0分
5 人评分
【绝对值排序】 (C语言代码)浏览:498 |
printf基础练习2 (C语言代码)浏览:3404 |
C语言考试练习题_保留字母 (C语言代码)浏览:733 |
C语言程序设计教程(第三版)课后习题5.7 (C语言代码)浏览:1090 |
C语言程序设计教程(第三版)课后习题11.3 (C语言代码)浏览:770 |
C语言程序设计教程(第三版)课后习题8.5 (C语言代码)浏览:600 |
2003年秋浙江省计算机等级考试二级C 编程题(2) (C语言代码)浏览:654 |
永远的丰碑 (C语言代码)浏览:608 |
矩形面积交 (C语言代码)浏览:1433 |
C语言程序设计教程(第三版)课后习题11.3 (C语言代码)浏览:661 |