题意整理。

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

方法一(循环+set)

1.解题思路

  • 利用while循环,从右向左遍历输入数字n中的每一位。
  • 然如果未包含当前位temp,则算到新的整数里。判断是否包含可以利用HashSet。

动图展示: alt

2.代码实现

import java.util.Scanner;
import java.util.HashSet;

public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        //用于判断是否已包含某个数字
        HashSet<Integer> set=new HashSet<>();
        int res=0;
        //从右向左遍历n中的每一位
        while(n!=0){
            //当前数字
            int temp=n%10;
            //如果未包含,算到新的整数里
            if(!set.contains(temp)){
                res=res*10+temp;
            }
            set.add(temp);
            n/=10;
        }
        System.out.println(res);
    }
}

3.复杂度分析

  • 时间复杂度:需要遍历n的每一位,所以时间复杂度为O(log10n)O(log_{10}n)
  • 空间复杂度:由于总共只有0-9共10个数字占用每一位,所以哈希表的大小为常数级别,空间复杂度为O(1)O(1)

方法二(利用lastIndexOf)

1.解题思路

  • 逆序遍历s中的每一个字符,将字符转化为对应的字符串。
  • 然后利用lastIndexOf判断结果中是否包含了当前字符串。如果未包含,则加入到结果,如果已包含,则跳过。

2.代码实现

import java.io.*;

public class Main{
    public static void main(String[] args){
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        String s;
        try{
            //记录结果的变量
            StringBuilder res=new StringBuilder();
            while((s=br.readLine())!=null){
                int n=s.length();
                //从右向左阅读s
                for(int i=n-1;i>=0;i--){
                    //将当前字符转化为对应字符串
                    String s1=String.valueOf(s.charAt(i));
                    //如果不再结果里,则直接加入
                    if(res.lastIndexOf(s1)==-1){
                        res.append(s1);
                    }
                }
            }
            //输出结果
            System.out.println(Integer.parseInt(res.toString()));
        }
        catch(IOException e){
            
        }
        
    }
}

3.复杂度分析

  • 时间复杂度:需要遍历s中的每一个字符,s对应的数字大小为n,则时间复杂度为O(log10n)O(log_{10}n)
  • 空间复杂度:需要额外常数级别的空间,所以空间复杂度为O(1)O(1)