簡體   English   中英

刪除數組元素后如何將元素向左移動?

[英]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循環。 有什么方法可以不使用任何內置方法來減少時間復雜度?

這是另一個變體:

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

以下代碼給出了預期的結果:

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]

第一個版本,對您的代碼進行了小幅修復。 您的問題是,移位后的元素需要替換為零。 基本上需要一個帶有arr.length - count if的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("");
    }

給出相同的輸出

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM