如何找出 IntStream 中缺少哪些数字

0 java algorithm java-stream

我想返回一个由没有出现在任何参数编号中的数字(按升序)组成的字符串。我不知道这应该怎么做,但我想使用 long 作为比较器来找出 IntStream 中丢失的数字。

例如,如果numeros = [1201, 23045],我必须返回“6789”

我的代码:

public static String digitosQueNoEstanEn(List<Long> numeros)
{
    long n = 1234567890;
    IntStream numStream = numeros.stream()
        .map(c -> c.toString())
        .flatMapToInt(c -> c.chars())
        .distinct();
Run Code Online (Sandbox Code Playgroud)

Jac*_* G. 5

这个问题有很多解决方案,其中之一是简单的集合移除。您基本上想从有效数字集中删除所有使用过的数字,并将结果存储为String. 这可以通过以下方式完成:

public static String digitosQueNoEstanEn(List<Long> numeros) {
    Set<Integer> usedDigits = numeros.stream()
                                     .map(String::valueOf)
                                     .flatMapToInt(String::chars)
                                     .map(c -> Character.digit(c, 10))
                                     .boxed()
                                     .collect(Collectors.toSet());

    return IntStream.range(0, 10)
                    .filter(i -> !usedDigits.contains(i))
                    .sorted()
                    .mapToObj(Integer::toString)
                    .collect(Collectors.joining());
}
Run Code Online (Sandbox Code Playgroud)

当使用您的 示例调用时[1201L, 23045L],输出是您所期望的:

6789
Run Code Online (Sandbox Code Playgroud)

Andy Turner 还提到使用 aBitSet可能是一个可行的解决方案。如果您选择使用一个,您的解决方案可能如下所示:

public static String digitosQueNoEstanEn(List<Long> numeros) {
    BitSet bitSet = BitSet.valueOf(new long[] { 0b0011_1111_1111 });

    numeros.stream()
        .map(String::valueOf)
        .flatMapToInt(String::chars)
        .map(c -> Character.digit(c, 10))
        .forEach(bitSet::clear);

    return bitSet.stream()
                 .sorted()
                 .mapToObj(Integer::toString)
                 .collect(Collectors.joining());
}
Run Code Online (Sandbox Code Playgroud)