最近开始找工作,所以在拼命刷题学习增强编程的能力(本人使用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;
学习自牛客网,希望自己变得更强!