1. 程式人生 > >LeetCode | Remove Element(刪除指定元素)

LeetCode | Remove Element(刪除指定元素)

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.

刪除陣列中制定的元素,返回新的長度

題目解析

這道題和上一道題目很類似,也是遇到不合法的資料用後面的資料替換,不過這裡的j不是從前往後遍歷, 而是從後向前遍歷,找到第一個不是關鍵字的資料放置到arr[i]的位置,然後i+1繼續遍歷。注意一些細節,比如輸入的引數不合法(空指標,長度為零等情況),這道題目就不難了。

另:

也可以跟上一題一樣,i和j都是從前向後遍歷,當arr[j]的值和key的值不相等就對arr[i]進行賦值。

#include <stdio.h>
#include <stdlib.h>

int RemoveElement(int arr[],int len,int key);

int main()
{
    int n,key;
    int arr[20];

    while(scanf("%d %d",&n,&key) != EOF){
        for(int i = 0;i < n;++i)
            scanf("%d",&arr[i]);
        int len = RemoveElement(arr,n,key);
        printf("len = %d\n",len);
        for(int i = 0;i < len;++i){
            printf("%d ",arr[i]);
        }
        putchar('\n');
    }

    return 0;
}

int RemoveElement(int arr[],int len,int key)
{
    int i = 0,j = len-1;

    if(arr == NULL || len <=0)
        return 0;

    while(i <= j){
        if(arr[i] == key){
            while(i<=j){
                if(arr[j] != key)
                    break;
                --j;
            }
            if(i>j) //當最後的資料全部都是要刪除的關鍵字的時候,會產生這樣的情況
                break;
            arr[i] = arr[j];    //將後面的資料放置到要刪除的資料的位置
            --j;
        }
        ++i;
    }
    //最後返回的i的位置,不是合法的資料,從0--> i-1位置才是我們要求解的
    return i;   //這時的返回值表示長度
}