java提取不重复的整数_提取不重复的整数 - yedushusheng的个人空间 - OSCHINA - 中文开源技术交流社区...

本文介绍了一种算法,用于从输入的整数中去除重复的数字,并按从右向左的顺序输出新的整数。提供了三种不同的实现方案,包括使用数组、集合与队列以及映射表的方法。

1、题目描述

输入一个int型整数,按照从右向左的阅读顺序,返回一个不含重复数字的新的整数。

输入描述:

输入一个int型整数

输出描述:

按照从右向左的阅读顺序,返回一个不含重复数字的新的整数

输入例子:

9876673

输出例子:

37689

2、程序

方案一

基本思路:初值设为0,然后读到和0相等的输出,然后基准值加1,即下一步与1比较相等输出,这样就避免了重复。

#include

#include

using namespace std;

int main(){

int a[10]={0};

string str;

getline(cin,str);

int num = str.size();

int i;

for(i=num-1;i>=0;i--){

if(a[str[i]-'0']==0){

cout<

a[str[i]-'0']++;

}

}

return 0;

}

方案二

基本思路:借助容器进行操作。

//set用来记录已经被我们记录了的不重复的数字

//queue保证从后往前以此输出

#include 

#include 

#include 

using namespace std;

int main()

{

int n;

cin>>n;

set temp;

queue res;

while(n%10){

if(temp.find(n%10)==temp.end()){

res.push(n%10);

temp.insert(n%10);

}

n/=10;

}

while(!res.empty()){

cout<

res.pop();

}

return 0;

}

方案三

基本思路:以上方案均适用于数字,不具有普遍性。直接以字符串形式输入,这样既适用于字符串,也适用于数字。利用容器进行操作,这里位置和数值对应关系,我们可以采用map容器。

#include 

#include 

#include 

#include 

#include 

using namespace std;

int main(){

string str;

while(cin>>str)

//等待输入结束

//当然,这一步可以采用getline()和for()循环替代,即getline(cin,str)获取输入,然后for(int i=0;i

{

map map_input;

//直接将数字作为字符串输入,这样的方案较好

for(int i=str.size()-1;i>=0;i--){

//for(int i=str.length()-1;i>=0;i--)

//起始位置为str.size()-1而不是str.size(),终点是0而不是1,下标为size()的数值越界了(下标从0开始的)

if(map_input.find(str[i])!=map_input.end()){

//用find函数来定位数据出现位置,它返回的一个迭代器,当数据出现时,它返回数据所在位置的迭代器,如果map中没有要查找的数据,它返回的迭代器等于end函数返回的迭代器

//把最后一个作为基准值进行比较,即key选取has.end()这一元素

map_input[str[i]]++;

//如果查找到与参考值相等的,则将该key对应的value加1

}

else{

map_input[str[i]]=1;

//没有与参考值相等的key,value均为1,我们值输出value值为1的key

cout<

}

}

cout<

}

}

注意:

(1)获取输入以及循环的基本操作:

方法一:

while(cin >> str){

//处理函数

}

方法二:

getline(cin,str);

//获得输入并将输入的数值绑定到str变量

for(int i=0;i

//处理函数

}

(2)这里涉及到一个很重要的操作,即选择字符串中的某一些数据输出,这里不是所谓的删除操作,那样问题就复杂化了,我们可以转化为有条件的输出,例如:

if(map_input.find(str[i]) != map_input.end())

//把最后一个作为基准值进行比较,即key选取has.end()这一元素

map_input[str[i]]++;

else

{

map_input[str[i]] = 1;

cout<

}

这里要求输出不重复的字符,则我们应该采取这样的思路:如果不是重复的字符则输出,重复的直接跳过。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值