刷题心得

最近开始找工作,所以在拼命刷题学习增强编程的能力(本人使用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;



学习自牛客网,希望自己变得更强!

猜你喜欢

转载自blog.csdn.net/qq_27767337/article/details/80332466