1. 程式人生 > >【leetcode】從排序陣列中刪除重複項(C、Python解答)

【leetcode】從排序陣列中刪除重複項(C、Python解答)

題目:

給定一個排序陣列,你需要在原地刪除重複出現的元素,使得每個元素只出現一次,返回移除後陣列的新長度。

不要使用額外的陣列空間,你必須在原地修改輸入陣列並在使用 O(1) 額外空間的條件下完成。

示例 1:

給定陣列 nums = [1,1,2],

函式應該返回新的長度 2, 並且原陣列 nums 的前兩個元素被修改為 1, 2。

你不需要考慮陣列中超出新長度後面的元素。 示例 2:

給定 nums = [0,0,1,1,1,2,2,3,3,4],

函式應該返回新的長度 5, 並且原陣列 nums 的前五個元素被修改為 0, 1, 2, 3, 4。

你不需要考慮陣列中超出新長度後面的元素。

題目分析:

不要使用額外的陣列空間,你必須在原地修改輸入陣列並在使用 O(1) 額外空間的條件下完成 也就是說我們不能再新申請一個數組,當然對於高階程式語言,我們也沒有必要去再新申請一個數組,此規則是針對於C這種程式語言 題目中向函式中傳入陣列的方式是:“傳地址形式傳陣列” 關於向函式傳入陣列的兩種方式,也是經常遇到的考題,筆者在這裡也做了一些總結: 傳地址形式傳陣列 陣列名相當於指向陣列首地址的常量指標。

傳地址方式傳陣列時,若在函式宣告中陣列方括號中有數字,若為正數則忽略,若為負數則報錯,所以一般函式宣告及定義如下:

void modifyArray(int b[], int size)

因陣列代表陣列第一個元素的地址,因此用陣列名作為實參就可以將陣列的起始地址傳遞給被調函式。所以當被調函式在函式體中修改陣列元素時,真正修改的是儲存在原儲存單元中的陣列元素。也可通過如下方式宣告:

void modifyArray(int *b, int size)

傳值形式傳陣列 當結構體傳遞給一個函式時,是它們是傳值的方式傳遞的,可以通過使用結構體,來按照傳值的方式傳遞一個數組。需先創立一個以該陣列為成員的結構體,然後以傳值的方式傳遞這個結構體,這樣陣列就以傳值的方式被傳遞過去。例:

#include <stdio.h>
 
#define SIZE 5
 
typedef struct
{
    int data[SIZE];
    int size;
} Array;
 
void modifyArray(Array);
 
int main(int argc, char const *argv[])
{
    int i;
    Array array;
    array.size = SIZE;
    for (i = 0; i < SIZE; i++) {
        array.data[i] = i;
    }
 
    modifyArray(array);
 
    for (i = 0; i < SIZE; i++) {
        printf("%d\n", array.data[i]);
    }
    return 0;
}
 
void modifyArray(Array a) {
    int i;
    for (i = 0; i < a.size; i++) {
        a.data[i] = 1;
    }
}

C語言解答:

int removeDuplicates(int* nums, int numsSize)
{
    if(numsSize==0) return 0;
    int k=1;
    for(int i=1;i<numsSize;i++)
    {
        if(nums[i]==nums[i-1]) continue;
        nums[k++]=nums[i];
    }
   return k;
     
}

Python解答:

class Solution:
    def removeDuplicates(self, nums):
        """
        :type nums: List[int]
        pe: int
        """
        i=0
        while i<len(nums)-1:
            if nums[i]==nums[i+1]:
                nums.remove(nums[i])
            else:
                i=i+1
        return len(nums)