Как узнать, что в Java 8 отсутствует отсутствующее число с прогрессивной арифметикой в ​​Списке <Integer>? - PullRequest
1 голос
/ 22 марта 2019

У меня огромный список чисел в последовательности, но один номер отсутствует. Как я могу узнать, что пропущено число разрыва с эффективностью, используя Java 8 +?

Я так и сделал:

public class PAMissingNumber {
    public static void main(String[] args) {
        List<Integer> listInteger = Arrays.asList(1, 2, 3, 4, 6, 7, 8, 9, 10);  //imagine that this list is huge    
        Collections.sort(listInteger);
        int result = 0;
        int sequence = listInteger.get(0);
        for (int i = 0; i < listInteger.size(); i++) {
            if (sequence!= listInteger.get(i)) {
                result = sequence;
                break;
            } else {
                sequence++;
            }
        }
        System.out.println("The missing number is : " + result);
    }
}

Может ли кто-нибудь помочь мне более эффективно кодировать это?

Ответы [ 2 ]

3 голосов
/ 22 марта 2019

Ответ Евгения указывает в правильном направлении.Если список не отсортирован и не всегда начинается с единицы, обобщенным решением будет

IntSummaryStatistics iss = listInteger.stream()
    .mapToInt(Integer::intValue).summaryStatistics();
long from = iss.getMin(), to = iss.getMax(), sum = iss.getSum();
int diff = (int)((from+to)*(to-from+1)/2 - sum);
System.out.println(diff);

. Альтернативой является использование BitSet:

BitSet bs = listInteger.stream().collect(BitSet::new, BitSet::set, BitSet::or);
System.out.println(bs.nextClearBit(bs.nextSetBit(0)));

.временное хранилище, но имеет преимущество в том, что оно все еще работает, даже если отсутствует более одного значения.

1 голос
/ 22 марта 2019

Если ваши цифры начинаются с 1, если на самом деле очень просто.

Сумма всех чисел вычисляется по формуле: x(x+1)/2, то есть, если ваш список [1,2,3,4,5,6,7,8,9,10]:

  sum = 10 * 11 / 2 = 55;

Все, что вам нужно сделать, это добавить все свои номера и внести разницу (это также означает, что в вашем списке нет повторяющихся номеров):

 List<Integer> listInteger = Arrays.asList(1, 2, 3, 4, 6, 7, 8, 9, 10);

 int max = Collections.max(listInteger);
 int sum = max * (max + 1) / 2;
 int diff = sum - listInteger.stream().mapToInt(Integer::intValue).sum();
 System.out.println(diff);

Учитывая хороший комментарий от Картика, это можно записать так:

List<Integer> listInteger = Arrays.asList(2, 3, 4, 6, 7, 8);

    IntSummaryStatistics summaryStatistics =
        listInteger.stream()
                   .collect(Collectors.summarizingInt(Integer::intValue));
    int max = summaryStatistics.getMax();
    int min = summaryStatistics.getMin();
    int sum = (int) summaryStatistics.getSum();

    System.out.println((max - min + 1) * (max + min) / 2 - sum);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...