删除数组元素后如何将元素向左移动?

How to shift elements to left after removing array element?

我被要求写,从数组中删除元素 (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]

另外,我担心在这里使用嵌套的 for 循环。有没有什么方法可以在不使用任何内置方法的情况下降低时间复杂度?

第一个版本对您的代码进行了小的修正。您的问题是移位的元素需要替换为零。这基本上需要一个带有 arr.length - count

的 if 语句
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("");
    }

给出相同的输出

为了不彻底改变您的方法,我建议在末尾添加另一个数组迭代,以将 0s 插入到 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------");
// ...

有一些 cleaner/more-efficient 方法可以解决这个问题。 完全根据您的方法,我继续对您的嵌套循环进行了修改,使其不需要另一次迭代。

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!!
        } 
    }
}

下面的代码给出了想要的结果:

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;
    }
}

不知道有没有帮助。这是一个简化的方法,更容易阅读和理解(至少对于学过 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]

这是另一种变体:

    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;
    }