从给定的整数中删除重复的数字

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

A link to Online Demo

另一种不使用字符串的方法意味着继续将数字除以 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测试代码:

https://www.jdoodle.com/iembed/v0/rSi