从给定的整数中删除重复的数字
Remove duplicate Digits form the given integer
我已经根据以下方法得到了结果,但我不满意。
我想要一些其他有效的方式来获得预期的输出。
输入:
112341
输出:
1234
输出中不应显示重复项,答案必须是 1234
。
我的解决方案:
public class PrintUnique {
public static void main(String[] args) {
int result = printUniquNums(112341);
System.out.println(result);
}
private static int printUniquNums(int num) {
String nums = Integer.toString(num);
char [] ch = nums.toCharArray();
Set<Character> store = new LinkedHashSet<>();
String res = "";
for (int i = 0; i < ch.length; i++){
if (store.add(ch[i])){
res += ch[i];
}
}
return Integer.parseInt(res);
}
}
这在性能方面并没有提高效率。但它的代码行数更少,更易于阅读,这在大多数情况下更为重要。
private static int printUniquNums(int num) {
TreeSet<String> tree= new TreeSet<>();
for (char c : Integer.toString(num).toCharArray()) {
tree.add(String.valueOf(c));
}
return Integer.parseInt(String.join("", tree));
}
对 Java lambda 和流进行一些微调。你的代码也不错
public static void main(String[] args) {
int result = printUniquNums(112341);
System.out.println(result);
}
private static int printUniquNums(int num) {
String nums = Integer.toString(num);
List<String> digits = List.of(nums.split(""));
Set<String> uniqueDigits = new HashSet<>();
String uniqueNum = digits.stream().filter(uniqueDigits::add).reduce(String::concat).orElse(""); // set add method returns true if value not present
return Integer.parseInt(uniqueNum);
}
您的方法可以使用 Stream API.
重新实现
最简单的方法之一是创建一个 代码点流 。
然后我们需要应用distinct()
来确保流元素的唯一性。此操作在幕后利用 LinkedHashSet
拒绝重复项并保留初始顺序。
最后,通过将 StringBuilder
用作执行可变缩减的 容器 来应用终端操作 collect()
。
private static int printUniquNums(int num) {
String result = String.valueOf(num).codePoints() // generating a stream of code points
.distinct() // ensure uniqueness
.collect(StringBuilder::new, // mutable container
StringBuilder::appendCodePoint, // defining how values should be accumulated in the container
StringBuilder::append) // how to merge the containers obtained while executing the stream in parallel
.toString();
return Integer.parseInt(result);
}
另一种实现方式是 map 将元素流化为 String
类型并使用 built-in collector joning()
将负责 as:
的流连接
private static int printUniquNums(int num) {
String result = String.valueOf(num).codePoints() // generating a stream of code points
.distinct() // ensure uniqueness
.map(Character::getNumericValue) // getting a numeric value from a code point
.mapToObj(String::valueOf) // creating a single-character string
.collect(Collectors.joining()); // combining the strings together
return Integer.parseInt(result);
}
public static void main(String[] args) {
int result = printUniquNums(112341);
System.out.println(result);
}
输出(对于两种解决方案):
1234
另一种不使用字符串的方法意味着继续将数字除以 10 以计算数字的数字减一,并在 Set
中从左到右收集每个数字,特别是 LinkedHashSet
维护插入顺序。然后,使用流重建没有重复数字的数字:
public static int uniqueNumber(int num) {
int temp;
Set<Integer> set = new LinkedHashSet<>();
while (num > 10) {
temp = (int) Math.pow(10, Math.ceil(Math.log10(num)) - 1);
set.add(num / temp);
num %= temp;
}
set.add(num);
Integer[] digits = set.toArray(new Integer[set.size()]);
return IntStream.range(0, digits.length)
.map(i -> digits[i] * ((int) Math.pow(10, (digits.length - 1) - i)))
.reduce(0, (a, b) -> a + b);
}
输出
1234
这里是link测试代码:
我已经根据以下方法得到了结果,但我不满意。
我想要一些其他有效的方式来获得预期的输出。
输入:
112341
输出:
1234
输出中不应显示重复项,答案必须是 1234
。
我的解决方案:
public class PrintUnique {
public static void main(String[] args) {
int result = printUniquNums(112341);
System.out.println(result);
}
private static int printUniquNums(int num) {
String nums = Integer.toString(num);
char [] ch = nums.toCharArray();
Set<Character> store = new LinkedHashSet<>();
String res = "";
for (int i = 0; i < ch.length; i++){
if (store.add(ch[i])){
res += ch[i];
}
}
return Integer.parseInt(res);
}
}
这在性能方面并没有提高效率。但它的代码行数更少,更易于阅读,这在大多数情况下更为重要。
private static int printUniquNums(int num) {
TreeSet<String> tree= new TreeSet<>();
for (char c : Integer.toString(num).toCharArray()) {
tree.add(String.valueOf(c));
}
return Integer.parseInt(String.join("", tree));
}
对 Java lambda 和流进行一些微调。你的代码也不错
public static void main(String[] args) {
int result = printUniquNums(112341);
System.out.println(result);
}
private static int printUniquNums(int num) {
String nums = Integer.toString(num);
List<String> digits = List.of(nums.split(""));
Set<String> uniqueDigits = new HashSet<>();
String uniqueNum = digits.stream().filter(uniqueDigits::add).reduce(String::concat).orElse(""); // set add method returns true if value not present
return Integer.parseInt(uniqueNum);
}
您的方法可以使用 Stream API.
重新实现最简单的方法之一是创建一个 代码点流 。
然后我们需要应用distinct()
来确保流元素的唯一性。此操作在幕后利用 LinkedHashSet
拒绝重复项并保留初始顺序。
最后,通过将 StringBuilder
用作执行可变缩减的 容器 来应用终端操作 collect()
。
private static int printUniquNums(int num) {
String result = String.valueOf(num).codePoints() // generating a stream of code points
.distinct() // ensure uniqueness
.collect(StringBuilder::new, // mutable container
StringBuilder::appendCodePoint, // defining how values should be accumulated in the container
StringBuilder::append) // how to merge the containers obtained while executing the stream in parallel
.toString();
return Integer.parseInt(result);
}
另一种实现方式是 map 将元素流化为 String
类型并使用 built-in collector joning()
将负责 as:
private static int printUniquNums(int num) {
String result = String.valueOf(num).codePoints() // generating a stream of code points
.distinct() // ensure uniqueness
.map(Character::getNumericValue) // getting a numeric value from a code point
.mapToObj(String::valueOf) // creating a single-character string
.collect(Collectors.joining()); // combining the strings together
return Integer.parseInt(result);
}
public static void main(String[] args) {
int result = printUniquNums(112341);
System.out.println(result);
}
输出(对于两种解决方案):
1234
另一种不使用字符串的方法意味着继续将数字除以 10 以计算数字的数字减一,并在 Set
中从左到右收集每个数字,特别是 LinkedHashSet
维护插入顺序。然后,使用流重建没有重复数字的数字:
public static int uniqueNumber(int num) {
int temp;
Set<Integer> set = new LinkedHashSet<>();
while (num > 10) {
temp = (int) Math.pow(10, Math.ceil(Math.log10(num)) - 1);
set.add(num / temp);
num %= temp;
}
set.add(num);
Integer[] digits = set.toArray(new Integer[set.size()]);
return IntStream.range(0, digits.length)
.map(i -> digits[i] * ((int) Math.pow(10, (digits.length - 1) - i)))
.reduce(0, (a, b) -> a + b);
}
输出
1234
这里是link测试代码: