最近开始找工作,所以在拼命刷题学习增强编程的能力(本人使用C++面向对象的编程语言),但是有时候还是会暴力破解一些题目,所以程序运行的时间和内存消耗都比较大,看了别人的解答之后感觉,哇,原来这个题目还能这么解决....献上双膝。
话不多说,举个例子:
提取不重复的整数
题目描述
输入一个int型整数,按照从右向左的阅读顺序,返回一个不含重复数字的新的整数。
输入描述:
输入一个int型整数
输出描述:
按照从右向左的阅读顺序,返回一个不含重复数字的新的整数
示例1
输入
9876673
输出
37689
一开始看到这个题目想到的使用set容器,但是set虽然提供了去重的效果,但是set会自动排序所输入的元素,所以思路暂时断了...也想过暴力破解,但是暴力破解时候元素位置会发生改变...比较尴尬....
之后参考了别人的思路,使用标记数组int a[10] = {0},a[n % 10] = 1,
利用数组下标唯一来去重。
感觉这些大神数组用的很好。
附上代码
#include<iostream> using namespace std; int main() { int n; int a[10]={0}; int num=0; cin>>n ; while(n) { if(a[n%10]==0) { if(num == 0&&n%10 == 0) a[n%10] = 0; else { a[n%10]++; num=num*10+n%10; } } n/=10; } cout<<num<<endl; return 0; }
但是这里有一些问题,比如测试序列输入为200400时候,并不能返回402,所以这个程序还是存在bug
原因出在while循环中的判断语句,应该额外判断num是否是0.
循环体内部应该改为
if(a[n]==0) { if(num == 0&&n == 0) a[n] = 0; else { a[n]++; num=num*10+n; } } n/=10;
学习自牛客网,希望自己变得更强!