Удалить два или более последовательных числа, заканчивающиеся на 6 в массиве - PullRequest
0 голосов
/ 03 июля 2018

Я пробовал, но он работает только для двух последовательных цифр, а не для более чем двух. Пожалуйста, найдите код, который я пробовал ниже, и любезно предложите решение для этого.

Пример ввода:

3 6 36 62 121 66 26 376 661 6

Пример вывода:

3 62 121 661 6

Мой код:

public static List<Integer> processArray(ArrayList<Integer> array) {
    int num=0;
    int prevnum=0;
   for(int i =0;i<array.size();i++) {
       num=array.get(i);
       if(i>0 && array.get(i-1)%10==6 && num%10==6) {
          array.remove(i-1);
          array.remove(i-1);
       }
   }
    return array;
}

Ответы [ 3 ]

0 голосов
/ 03 июля 2018

В цикле for существует небольшая проблема. Поскольку ваш цикл for проходит через Arraylist, значение i увеличивается, а размер вашего Arraylist уменьшается из-за того, что вы удаляете элементы, заканчивающиеся на 6.

0 голосов
/ 03 июля 2018

При удалении элементов из списка мне всегда проще всего обрабатывать список в обратном направлении, от конца к началу. Таким образом, единственные индексы, которые сдвигаются при удалении элементов, - это те, с которыми я уже закончил, поэтому я могу игнорировать сдвиг.

public static void processArray(ArrayList<Integer> array) {
    // process from end of list backward
    int ix = array.size();
    while (ix > 0) {
        if (array.get(ix - 1) % 10 == 6) {
            // find beginning of run of numbers that end in 6
            int beginIx = ix - 1;
            while (beginIx > 0 && array.get(beginIx - 1) % 10 == 6) {
                beginIx--;
            }
            List<Integer> runOf6 = array.subList(beginIx, ix);
            if (runOf6.size() >= 2) {
                // delete entire run
                runOf6.clear();
            }
            ix = beginIx;
        }
        else {
            ix--;
        }
    }
}

Демо-версия:

ArrayList<Integer> list = new ArrayList<>(Arrays.asList(3, 6, 36, 62, 121, 66, 26, 376, 661, 6));
processArray(list);
System.out.println(list);

Выход:

[3, 62, 121, 661, 6]

Редактировать: Другой вариант - пойти противоположным путем: создать список результатов, добавив в исходный список те элементы, которые не являются частью серии из по меньшей мере двух чисел, заканчивающихся на 6. Как. в особом случае, если исходный список имеет длину 0 или 1, возвращает его как есть, поскольку в нем просто не может быть двух чисел, заканчивающихся на 6. В противном случае создайте список результатов. Итерация вперед по исходному списку. Для каждого элемента, если он заканчивается на 6, а также имеет соседа (по крайней мере) на одной стороне, которая заканчивается на 6, пропустите его; иначе добавьте это к результату. Старайтесь не проверять левого соседа первого элемента или правого соседа последнего, поскольку их не существует, и вы получите IndexOutOfBoundsException. Я предоставляю вам возможность изучить этот вариант, если хотите.

0 голосов
/ 03 июля 2018

Как уже упоминалось в комментариях. Первое решение просто работает для вашего текущего варианта использования. Для более гибкого решения вы можете использовать следующий фрагмент:

public static List<Integer> processList(List<Integer> list){
    int encountered = 0;
    for(ListIterator<Integer> it = list.listIterator(); it.hasNext(); ){
        int i = it.next();
        if(i % 10 == 6){
            encountered++;
        } else {
            encountered = 0;
        }
        if(encountered > 1){
            it.remove();
            if(encountered == 2){
                it.previous();
                it.remove();
            }
        }
    }
    return list;
}

Используется listIterator и переменная счетчика. Таким образом, мы можем просмотреть список, посчитать, сколько их 6, и, если их больше двух, удалить их.

Когда итератор не используется, вы начинаете пропускать элементы, как только начинаете удалять некоторые. Потому что при удалении элемента по индексу список сокращается. Следовательно, индекс элемента 1 выше будет скользить в недостающее место Когда вы увеличите индекс на следующем шаге, вы пропустите элемент.


OLD

Я бы предложил использовать итератор и 2 для циклов для достижения этого:

public static List<Integer> processList(List<Integer> list){
   for(Iterator<Integer> it = list.iterator(); it.hasNext(); ){
       for(int i = it.next(); i % 10 == 6 && it.hasNext(); i = it.next()){
           it.remove();
       }
   }
   return list;
}

Первый цикл for выполняет итерацию списка как обычно, где второй цикл удалит числа, если последняя цифра - 6.

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