原题链接:蓝桥杯算法提高VIP-删除重复元素
解题思路:
我的思路就是使用一个数组来储存每一个字符出现的次数,最后判断对应位置上的数组元素是否为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分
3 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复