【leetcode】從排序陣列中刪除重複項(C、Python解答)
阿新 • • 發佈:2018-12-13
題目:
給定一個排序陣列,你需要在原地刪除重複出現的元素,使得每個元素只出現一次,返回移除後陣列的新長度。
不要使用額外的陣列空間,你必須在原地修改輸入陣列並在使用 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。
你不需要考慮陣列中超出新長度後面的元素。
題目分析:
傳地址方式傳陣列時,若在函式宣告中陣列方括號中有數字,若為正數則忽略,若為負數則報錯,所以一般函式宣告及定義如下:
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)