题意整理。
- 输入一个int型整数。
- 按照从右向左的阅读顺序,返回一个不含重复数字的新的整数。
方法一(循环+set)
1.解题思路
- 利用while循环,从右向左遍历输入数字n中的每一位。
- 然如果未包含当前位temp,则算到新的整数里。判断是否包含可以利用HashSet。
动图展示:
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的每一位,所以时间复杂度为。
- 空间复杂度:由于总共只有0-9共10个数字占用每一位,所以哈希表的大小为常数级别,空间复杂度为。
方法二(利用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,则时间复杂度为。
- 空间复杂度:需要额外常数级别的空间,所以空间复杂度为。