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

时间:2019-02-18 07:14:29

标签: java arrays 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循环。有什么方法可以不使用任何内置方法来减少时间复杂度?

5 个答案:

答案 0 :(得分:2)

这是另一个变体:

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

答案 1 :(得分:1)

为了不彻底改变您的方法,我建议在数组的末尾添加另一个迭代,以便从数组的末尾向0-许多索引插入count。 / p>

这就像添加以下代码片段一样简单:

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

答案 2 :(得分:1)

以下代码给出了预期的结果:

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

第一个版本,对您的代码进行了小幅修复。您的问题是,移位后的元素需要替换为零。基本上需要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("");
    }

给出相同的输出