刪除數組中指定的元素

原題

  Given an array and a value, remove all instances of that value in place and return the new length.
  The order of elements can be changed. It doesn’t matter what you leave beyond the new length.java

題目大意

  給定一個數組和一個值,刪除數組中與這個值相等的元素,而且返回與這個數組的新的長度。算法

解題思路

  從左邊找值爲elem的元素的位置,j從右邊找值不爲elem的元素的位置,而後將j位置的數值移動到i位置。數組

代碼實現

算法實現類spa

public class Solution {
    public int removeElement(int[] A, int elem) {
        int exchange = 0; // 記錄交換的次數,也就是統計數組中與elem元素值相等的個數

        // 算法思想:i從左邊找值爲elem的元素的位置,j從右邊找值不爲elem的元素的位置,
        // 取等號是讓長度爲1的數組能夠進入
        for (int i = 0, j = A.length -1; i <= j; i++) {
            if (A[i] == elem) { // 找到要交換的元素
                exchange++;

                while (j > i && A[j] == elem) { // 從數組後面開始向前找第一個不等於elem的元素
                    exchange++; // 有值爲elem的元素說明要交換,可是交換過程能夠省去
                    j--;
                }

                // 狀況1:到到不爲elem的元素的位置,將j位置的元素放到i位置
                // 狀況2:沒有找到不elem的元素的位置,即i後的全部元素值都是e,此時有j=i
                // 不論哪一種狀況將j中的值放入i都沒有關係
                A[i] = A[j];
                j--; // j已經被交換使用了因此還要和前移動到一個新的位置
            }
        }

        return A.length - exchange;
    }
}
import java.util.Arrays;
import java.util.Scanner;
public class ArraysDelete {
 public static void main(String[] args) {
  //刪除數組中的某一個元素的方法:
  //把最後一個元素替代指定的元素,而後數組縮容
  Scanner sc =new Scanner(System.in);
  int[] arr = new int[]{1,2,4,5,9,8,0};

  System.out.println(Arrays.toString(arr));
  System.out.println("請輸入要刪除第幾個元素:");

  int n = sc.nextInt();
  sc.close();
  //把最後一個元素替代指定的元素
  arr[n-1] = arr[arr.length-1];

  //數組縮容
  arr = Arrays.copyOf(arr, arr.length-1);
  System.out.println(Arrays.toString(arr));

 }
}
運行結果:
[1, 2, 4, 5, 9, 8, 0]
請輸入要刪除第幾個元素:
3
[1, 2, 0, 5, 9, 8]
相關文章
相關標籤/搜索