首页 > 试题广场 >

提取不重复的整数

[编程题]提取不重复的整数
  • 热度指数:513226 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
输入一个 int 型整数,按照从右向左的阅读顺序,返回一个不含重复数字的新的整数。
保证输入的整数最后一位不是 0 。

数据范围:

输入描述:

输入一个int型整数



输出描述:

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

示例1

输入

9876673

输出

37689
#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)
        {
            a[n%10]++;//这一步是更新,遇到下次相同的数会跳过
            num=num*10+n%10;
        }
        n/=10;
    }
    
    cout<<num<<endl;
    
    return 0;
}

发表于 2016-03-30 15:21:56 回复(108)
import java.util.*;
public class Main {

    public static void main(String[] args)  {
	// write your code here
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();
        char[] chars = str.toCharArray();
        Map<Integer, Integer> map = new HashMap<>();
        for(char c : chars){
            map.put(c-'0',map.getOrDefault(c-'0',0)+ 1);
        }
        StringBuilder sb = new StringBuilder();
        for(int i = chars.length - 1; i >=0; i--){
            if(map.get(chars[i] - '0') >= 1){
                sb.append(chars[i]);
                map.put(chars[i] - '0',0);
            }
        }
        System.out.println(sb.toString());
    }
}

发表于 2022-07-06 17:01:12 回复(0)
#include<iostream>
using namespace std;
int main()
{
    int num;
    cin>>num;
    bool flag[10]={0};
    while(num)
    {
        if(flag[num%10]==0) cout<<(num%10);
        flag[num%10]=1;  
        num/=10;
    }
}

发表于 2022-05-08 22:18:13 回复(0)
取余并记录数字,在为1的时候输出
# include<iostream>
using namespace std;

int main()
{
    int n;
    scanf("%d", &n);
    int hash[10] ={0};
    int num;
    do
    {
        num = n%10;
        hash[num]++;
        n/=10;
        if(hash[num]==1)
            printf("%d", num);
    }while(n>0);
    return 0;
}


发表于 2022-03-21 09:00:43 回复(0)
import java.util.*;
public class Main{
    public static void main(String args[]){
        Scanner sc = new Scanner(System.in);
        String str = String.valueOf(sc.next());
        HashMap<Character,Integer> map = new HashMap<Character,Integer>();
        int len = str.length()-1;
        StringBuilder sb = new StringBuilder();
        for(int i = len ; i >= 0;i--){
            if(map.containsKey(str.charAt(i))){
                continue;
            }
            sb.append(str.charAt(i));
            map.put(str.charAt(i),1);
        }
        int ans = Integer.valueOf(sb.toString());
        System.out.println(sb);
    }
}

发表于 2022-02-18 00:03:35 回复(1)
StringBuilder去重。
import java.util.Scanner;

/**
 * @author aiker
 * @since 2021/11/6
 */
public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            StringBuilder sb = new StringBuilder();
            int nextInt = scanner.nextInt();

            String number = String.valueOf(nextInt);

            for (int i = number.length(); i > 0; i--) {
                String substring = number.substring(i - 1, i);
                if (sb.indexOf(substring) == -1) {
                    // 不包含
                    sb.append(substring);
                }
            }
            System.out.println(Integer.parseInt(sb.toString()));
        }
    }

}


发表于 2021-11-06 13:07:26 回复(0)
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int nums; cin >> nums;
    string str = to_string(nums);
    unordered_set<char> set;
    std::unordered_set<char>::iterator it;
    reverse(str.begin(), str.end());
    for (int i = 0; i < str.length(); i++)
    {
        set.insert(str[i]);
    }
    string res;
    for (it = set.begin(); it != set.end(); it++)
    {
        res += *it;
    }
    int n = atoi(res.c_str());
    cout <<res<< endl;
}
发表于 2021-10-22 15:49:47 回复(2)
//我能想到的最优解,用字符串可以节约内存
#include<iostream>
#include<string>
#include<cstdlib>
using namespace std;

int main() {
    string str;
    cin>>str;
    int len = str.length();
    for (int i=len-1; i>=0; --i) {
        char key = str[i];
        bool repeat=false;
        for (int j=i+1; j<len; ++j) {
            if (str[j]==key) {
                repeat = true;
                break;
            }
        }
        if (repeat == false) cout<<key;
    }
    return 0;
}
发表于 2021-09-29 10:51:42 回复(0)
import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		StringBuffer sb = new StringBuffer(sc.nextLine());
		sb.reverse();
		String out="";
		for (int i = 0; i < sb.length(); i++) {
			if (!out.contains(sb.substring(i, i+1))) {
				out+=sb.substring(i, i+1);
			}
		}
		System.out.println(out);
	}
}

发表于 2021-09-07 09:54:17 回复(0)
利用标准库set的无重复特性,一次循环输出字符即可


#include <iostream>
#include <set>
#include <string>

using namespace std;

int main(void)
{
    string strCin;
    getline(cin, strCin);
    set<char> arrNumber;
    for (auto it = strCin.rbegin(); it != strCin.rend(); it++)
    {
        bool bRet = arrNumber.insert(*it).second;
        if (bRet)
        {
            cout << *it;
        }
    }
}

发表于 2021-08-31 11:09:51 回复(0)
list1=list(input().strip())
list1.reverse()
list2=list(set(list1))
for i in list1:
    if i in list2:
        list2.remove(i)
        print(i,end="")

发表于 2021-08-28 23:10:08 回复(0)
#include<stdio.h>
#include<string.h>
int main(){
    char str[100]={0};
    int nums[10]={0};
    int len=0;
    scanf("%s",str);
    len=strlen(str);
    for(int i=0;i<len;i++){
        nums[(int)str[i]-48]+=1;
    }
    for(int j=len-1;j>=0;j--){
        if(nums[(int)str[j]-48]>=1){
            printf("%c",str[j]);
            nums[(int)str[j]-48]=0;
        }
    }
    return 0;
}
发表于 2021-08-23 02:18:35 回复(0)
n=list(input())
n.reverse()
re=[]
for i in n:
    if i not in re:
        re.append(i)

print(''.join(re))

发表于 2021-08-04 22:35:07 回复(0)
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Main{
    public static void main(String[] args) throws IOException{
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String input;
        while((input = reader.readLine())!=null){
            while(input.charAt(input.length()-1)=='0'){
                           input = input.substring(0,input.length()-1);
            }
                        //建立映射数组
            int[] map = new int[10];
            for(int i=input.length()-1;i>=0;i--){
                                //记录出现次数
                map[input.charAt(i)-'0']++;
                                //首次出现sh
                if(map[input.charAt(i)-'0']==1){
                  System.out.print(input.charAt(i));
                }
            }

            
        }
    }
}

编辑于 2021-06-12 23:06:48 回复(0)
JAVA使用标志数组实现
思路:
1、先将整型转为字符数组
2、逐个处理字符,使用StringBuffer sb保存,使用标记数组buckets保存0-9出现的次数,超过0就不用加入sb中。

import java.util.Scanner;

public class Main{
    public static void main(String [] args){
        Scanner in = new Scanner(System.in);
        while(in.hasNext()){
            int i = in.nextInt();
            int [] buckets = new int[10];
            char [] chs = String.valueOf(i).toCharArray();
            StringBuffer sb = new StringBuffer();
            int index;
            for(int j = chs.length-1;j>=0;--j){
                index = Integer.valueOf(chs[j]+"");
                if (buckets[index]>0){
                    continue;
                }else {
                    sb.append(chs[j]);
                    buckets[index]++;
                }
            }
//            sb.reverse();//过程已经把顺序处理好,无需再做反转
            System.out.println(sb.toString());
        }
    }
}


发表于 2021-05-09 10:38:26 回复(0)
后进先出用栈
import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        Stack<Integer> stack = new Stack<>();
        while(n>0){
            if(stack.search(n%10)==-1) stack.add(n%10);
            n/=10;
        }
        stack.forEach(System.out::print);
    }
}
编辑于 2021-04-03 22:49:34 回复(0)
let snum = readline()
let arr = []
for(let i =0;i<snum;i++){
    arr.push(readline())
}
let obj = {}
for (let item of arr) {
  let key = Number(item.split(' ')[0])
  let val = Number(item.split(' ')[1])
  if (obj[key]) {
    obj[key] = obj[key] + val
  } else {
    obj[key] = val
  }
}
Object.keys(obj).map((key) => {
  console.log(key + ' ' + obj[key])
})
发表于 2021-04-02 15:21:13 回复(0)
/*
整数逆转+去重
用a[10]存储已有的数字
*/
#include<stdio.h>

int main(void){
    int n;
    int a[10]={0,0,0,0,0,0,0,0,0,0};
    scanf("%d",&n);
    while(n){
        int x=n%10;
        //printf("%d",x);
        if(a[x]==0){
            a[x]=1;
            printf("%d",x);
        }
        n/=10;
    }
    return 0;
}



发表于 2021-03-29 16:41:40 回复(0)
import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner input = new Scanner(System.in);
        int num = input.nextInt();
        String s = num+"";
        Map<Character,Integer> map = new HashMap<Character,Integer>();
        for(int i=0; i<s.length(); i++){
            if(!map.containsKey(map.get(s.charAt(i)))){
                map.put(s.charAt(i),1);
            }
        }
        
        for(int i=s.length()-1; i>=0; i--){
            if(map.containsKey(s.charAt(i))){
                System.out.print(s.charAt(i));
                map.remove(s.charAt(i));
            }
        }
        
        
    }
}
用了HashMap
发表于 2021-03-08 11:47:01 回复(0)
num = input()
length = len(num)
hash = [0]*10
out = []
for i in range(length-1,-1,-1):
    if(hash[int(num[i])] == 0):
        out.append(num[i])
    hash[int(num[i])] = 1
print(''.join(out))
=====================
利用hash记录各个数字是否出现过,当没出现过,加入输出列表中;当出现过,略过
发表于 2021-03-06 23:07:30 回复(0)