Как сдвинуть элементы влево после удаления элемента массива? - PullRequest
0 голосов
/ 18 февраля 2019

Меня попросили написать, чтобы удалить элемент (lets say k=30) из массива и сдвинуть другие элементы влево без использования встроенных методов.

Я попробовал следующий подход.

public static void main(String[] args) {
    // TODO Auto-generated method stub

    int[] arr = new int[] { 1, 2, 30, 4, 5, 30, 6 };

    int k = 30;
    int count = 0;

    System.out.println("---Original Array------");
    for (int i = 0; i < arr.length; i++) {
        System.out.print(arr[i] + " ");
    }

    for (int i = 0; i < arr.length; i++) {

        if (arr[i] == k)
            count++;
    }

    for (int j = 0; j < count; j++) {
        for (int i = 0; i < arr.length; i++) {

            if (arr[i] == k) {
                for (int l = i; l < arr.length - 1; l++) {
                    arr[l] = arr[l + 1];
                }
            }
        }

    }

    System.out.println("---Modified Array------");
    for (int i = 0; i < arr.length; i++) {
        System.out.print(arr[i] + " ");
    }

}

Мне нужен вывод, подобный следующему: [1 2 4 5 6 0 0]

Но вывод из вышеупомянутой логики: [1 2 4 5 6 6 6]

Кроме того, я беспокоюсь оиспользуя вложенные для циклов здесь.Есть ли способ уменьшить сложность времени без использования встроенных методов?

Ответы [ 5 ]

0 голосов
/ 18 февраля 2019

Вот еще один вариант:

    int[] arr = new int[] { 1, 2, 30, 4, 5, 30, 6 };

    int k = 30;
    int j = 0;

    for (int i = 0; i < arr.length; i++) {
        if (arr[i] != k) {
            arr[j++] = arr[i];
        }
    }
    while (j < arr.length) {
        arr[j++] = 0;
    }
0 голосов
/ 18 февраля 2019

Не знаю, поможет ли это.Это упрощенный подход, который легче читать и понимать (по крайней мере, для людей, изучивших C), который выполняет удаление по мере необходимости ...

 public static void main(String[] args) {
        int[] arr = new int[] { 1, 2, 30, 4, 5, 30, 6 };
        int k = 30;
        int i=0;
        int j=0;
        for(;j<arr.length;i++,j++){
            if((arr[i]=arr[j])==k) i--;
        }
        while(i<j)arr[i++]=0;
        System.err.println(Arrays.toString(arr));
   }

вывод: [1, 2, 4,5, 6, 0, 0]

0 голосов
/ 18 февраля 2019

Чтобы не радикально изменить ваш подход, я бы предложил добавить еще одну итерацию массива в конце, чтобы вставить 0 s в count -много числа индексов с конца вашего массива.

Это будет так же просто, как добавить следующий фрагмент:

// nested for loop
// ...

// set trailing elements to 0s
for (int i = 0; i < count ; i++) 
    arr[arr.length-1-i] = 0;

System.out.println("\n---Modified Array------");
// ...

Есть несколько более чистых / более эффективных способов решения этой проблемы.Основываясь именно на вашем подходе, я продолжил и внес изменения в ваш вложенный цикл, чтобы не требовать повторения.

for (int j = 0; j < count; j++) {
    for (int i = 0; i < arr.length; i++) {
        if (arr[i] == k) {
            for (int l = i; l < arr.length - 1; l++)
                arr[l] = arr[l + 1];
            // since we have performed the shifting, we can safely set the last element to 0
            arr[arr.length-1] = 0;   // <----- this was missing!!
        } 
    }
}
0 голосов
/ 18 февраля 2019

Следующий код дает желаемый результат:

int [] arr = { 1, 2, 30, 4, 5, 30, 6 };
int k = 30;

int elementCount = 0;

for (int i = 0; i < arr.length; i++) {
    if (arr[i] == k) {
        ++elementCount;
    }
}

int count = 0;

for (int i = 0; i < arr.length; i++) {
    if (arr[i] == k) {
        count++;
        for (int j = i; j < arr.length-1; j++) {
            arr[j] = arr[j+1];
        }
        arr[arr.length-1] = 0;
    }

    if (count == elementCount) {
        break;
    }
}
0 голосов
/ 18 февраля 2019

Первая версия с небольшим исправлением в вашем коде.Вы выпускаете, что сдвинутые элементы должны быть заменены на ноль.Который требует в основном оператора if с arr.length - count

public static void main(String[] args) {
        // TODO Auto-generated method stub

        int[] arr = new int[] { 1, 2, 30, 4, 5, 30, 6 };

        int k = 30;
        int count = 0;

        System.out.println("---Original Array------");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
        System.out.println("");

        for (int i = 0; i < arr.length; i++) {

            if (arr[i] == k)
                count++;
        }

        for (int j = 0; j < count; j++) {
            for (int i = 0; i < arr.length; i++) {
                if(i >= arr.length - count){
                    arr[i] = 0;
                }else {
                    if (arr[i] == k) {
                        for (int l = i; l < arr.length - 1; l++) {
                            arr[l] = arr[l + 1];
                        }
                    }
                }
            }

        }

        System.out.println("---Modified Array------");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
        System.out.println("");

    }

, который дает вывод

---Original Array------
1 2 30 4 5 30 6 
---Modified Array------
1 2 4 5 6 0 0 

Теперь мы можем упростить код также

public static void main(String[] args) {
        int[] arr = new int[] { 1, 2, 30, 4, 5, 30, 6 };
        int k = 30;
        int count = 0;

        System.out.println("---Original Array------");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
        System.out.println("");


        for(int i = 0; i < arr.length; i++){
            if(arr[i]==k){
                count++;
            }else{
                arr[i-count] = arr[i];
            }
        }

        for(int i = 1; i <= count; i++){
            arr[arr.length - i] = 0;
        }

        System.out.println("---Modified Array------");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
        System.out.println("");
    }

, которыйдать тот же вывод

...