Как проверить, что числа в последовательности в LinkedList - PullRequest
0 голосов
/ 27 августа 2018

Мне нужно проверить, находятся ли числа, которые я сохранил в своем LinkedList, в последовательности.

Примеры наборов: 123, 124, 125, 1900, 1901.

Если код встречает123, он проверяет следующее: от 124 до 125, затем останавливается, поскольку 1900 не является следующим числом после 125, когда вы естественным образом считаете.Поэтому мне нужно получить индексы первой (123) и последней последовательности (125).Затем перейдем к следующей последовательности, 1900 и 1901 гг.

    for(int o = 0; o < zeroIndex.size(); o++)
    {
        if(-1 == (zeroIndex.get(o) - zeroIndex.get(o+1)))
        {
            System.out.println(zeroIndex.get(o) + "trailing");
        }
    }

Ответы [ 3 ]

0 голосов
/ 27 августа 2018

Работает с O (n)

import java.util.LinkedList;

public class TestLinkedList {

    public static void main(String[] args) {

        LinkedList<Integer> a = new LinkedList<Integer>();
        a.add(124);
        a.add(125);
        a.add(126);
        a.add(1900);
        a.add(1901);

        int index = 0;
        int index1 = 0;

        for (int i = 0; i < a.size(); i++) {
            if (i+1 < a.size() && a.get(i) + 1 == a.get(i + 1)) {
                index1 = i + 1;
            } else {
                if (index != index1) {
                    System.out.println(index + " " + index1);
                }
                index = i+1;
                index1 = i+1;
            }
        }

    }

}

output

0 2
3 4
0 голосов
/ 27 августа 2018

Вот краткий пример того, как это сделать.Сначала создайте наш список.

List<Integer> a = new LinkedList<Integer>();
a.add(124);
a.add(125);
a.add(126);
a.add(1900);
a.add(1901);

Итак, теперь у нас есть список, давайте начнем.Во-первых, объявляя наши переменные

int current; //will hold the current value during the iteration   
int indexStart = 0; //the index of the beginning of the current sequence
int previous = a.get(0); //the previous value

int length = a.size(); //the length (optionnal, but this will be used later)

Затем, вот вам смешная часть (полностью прокомментированная)

//Iterate from 1 to the end (0 is already in `previous`
for(int i = 1 ; i < length; ++i){
    //get the current value
    current = a.get(i); 

    //if the sequence is broken, print the index and print also the sublist using `List.subList`.
    if(current != previous + 1){ 
        System.out.format("Sequence from %d to %d%n", indexStart, i - 1);
        System.out.println(a.subList(indexStart, i));

        //reset the start of the current sequence
        indexStart = i; 
    }

    //update the previous value with the current for the next iteration.
    previous = current;
}

//Print the last sequence.
System.out.format("Sequence from %d to %d%n", indexStart, length - 1);
System.out.println(a.subList(indexStart, length));

Это выведет:

Последовательность из 0до 2
[124, 125, 126]
Последовательность от 3 до 4
[1900, 1901]

Это довольно просто, просто повторяйте цикл и сохраняйте предыдущийи текущее значение, чтобы иметь возможность проверить правильность последовательности.

Обратите внимание, что с LinkedList я бы использовал Iterator, но мне нужен int index, так что это дало быболее длинное решение, поэтому для простоты я использовал List.get.

0 голосов
/ 27 августа 2018
    String serialIndex = "";
    for(int o = 1; o < zeroIndex.size(); o++)
        {serialIndex += "("+Integer.toString(o-1);
            while(i<zeroIndex.size() && zeroIndex.get(o-1)+1 == zeroIndex.get(o))
            {  i++;
                //System.out.println(zeroIndex.get(o) + "trailing");
            }
         serialIndex = serialIndex+Integer.toString(i-1)+"),";
     }
     System.out.println(serialIndex);

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

например 123, 124, 125, 1900, 1901. Начнем с124 ----- наша строка serialIndex будет (0 , а значение 124 больше, чем 123, поэтому мы увеличиваем i. Когда мы достигнем 1900, мы разорвем цикл while, так как 1900не на 1 больше 125 и теперь наша строка serialIndex будет b (0,2) .В конце мы получим строку serialIndex в виде (0,2), (3,4)

У меня нет вашего полного кода для тестирования, так что это лучшее, что я могу сделать. Если вы столкнулись с какой-либо ошибкой, пожалуйста, дайте мне знать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...