牛客网 华为机试训练-9
题目描述
输入一个int型整数,按照从右向左的阅读顺序,返回一个不含重复数字的新的整数。
输入一个int型整数,按照从右向左的阅读顺序,返回一个不含重复数字的新的整数。
示例
输入:
9876673
输出:
37689
思路
得到元素组长度建立相等长度的新数组,从后向前遍历,对数组中的每一个元素进行检查,要是新数组中没有相同元素则存入新数组。可以用特殊值来提前终止遍历。
代码实现
#include<iostream>
#include<algorithm>//fill函数
#include<string>//getline函数
using namespace std;
int main()
{
string str;//用于存储输入的字符串
getline(cin,str);
int num=str.length(),target=0;//新数组,记录新数组长度
bool flag=1;//重复标记值
int *arr=new int[num];
fill(arr,arr+num,-1);//给新数组赋特定初值
//从后向前遍历新数组
for(int i=num-1;i >= 0;i--)
{
//target为新数组长度,每次存入一个元素target++,
//使用target可以有效提前终止循环
for(int j=0;j<target;j++)
{
//等于-1时停止遍历
if(-1==arr[j]) break;
//string类型的数字向int类型的数字赋值时要减去'0'
if(str[i]-'0' == arr[j])
{
//有重复数字,flag置0
flag=0;
break;
}
}
//判断有无重复元素
if(flag)
{
//没有重复元素的话存入新数组,target++
arr[target]=str[i]-'0';
target++;
}
else
flag=1;
}
//从新数组输出元素
for(int i=0;i < target;i++)
{
cout<<arr[i];
}
cout<<endl;
return 0;
}
运行结果
总结
首先。本题中新字符串录入顺序和输出顺序不能颠倒,颠倒时会ABAB这样的排列会出现异常。
其次。不确定数组长度时可以使用设置变量记录当前长度的方式,简短遍历次数。
最后。string接受的数组于int型数字比较前需要先减去’0’(0的ASCII码值)。