1. 程式人生 > >LeetCode 645. 錯誤的集合(C、C++、python)

LeetCode 645. 錯誤的集合(C、C++、python)

集合 S 包含從1到 n 的整數。不幸的是,因為資料錯誤,導致集合裡面某一個元素複製了成了集合裡面的另外一個元素的值,導致集合丟失了一個整數並且有一個元素重複。

給定一個數組 nums 代表了集合 S 發生錯誤後的結果。你的任務是首先尋找到重複出現的整數,再找到丟失的整數,將它們以陣列的形式返回。

示例 1:

輸入: nums = [1,2,2,4]
輸出: [2,3]

注意:

給定陣列的長度範圍是 [2, 10000]。

給定的陣列是無序的。

C

/**
 * Return an array of size *returnSize.
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* findErrorNums(int* nums, int numsSize, int* returnSize) 
{
    int n=numsSize;
    sort(nums,0,n-1);
    int r1;
    for(int i=1;i<n;i++)
    {
        if(nums[i]==nums[i-1])
        {
            r1=nums[i];
            break;
        }
    }
    int s1=0;
    for(int i=0;i<n;i++)
    {
        s1+=nums[i];
    }
    int s0=s1-r1;
    int s2=0;
    for(int i=1;i<=n;i++)
    {
        s2+=i;
    }
    int* res=(int*)malloc(sizeof(int)*2);
    res[0]=r1;
    res[1]=s2-s0;
    *returnSize=2;
    return res;
}

void sort(int *a, int left, int right)
{
    if(left >= right)
    {
        return ;
    }
    int i = left;
    int j = right;
    int key = a[i]; 
    while(i < j)                            
    {
        while(i < j && key <= a[j])
        {
            j--;
        }       
        a[i] = a[j];
        while(i < j && key >= a[i])
        {
            i++;
        }         
        a[j] = a[i];
    }    
    a[i] = key;
    sort(a, left, i - 1);
    sort(a, i + 1, right);
}

C++

class Solution {
public:
    vector<int> findErrorNums(vector<int>& nums) 
    {
        int n=nums.size();
        set<int> tmp;
        int s0=0;
        int s1=0;
        int s2=0;
        for(int i=0;i<n;i++)
        {
            tmp.insert(nums[i]);
            s1+=nums[i];
            s2+=i+1;
        }
        set<int>::iterator it;
        for(it=tmp.begin();it!=tmp.end();it++)
        {
            s0+=*it;
        }
        return {s1-s0,s2-s0};
    }
};

python

class Solution:
    def findErrorNums(self, nums):
        """
        :type nums: List[int]
        :rtype: List[int]
        """
        n=len(nums)
        s1=sum(nums)
        b=set(nums)
        s0=sum(b)
        s2=0
        for i in range(1,n+1):
            s2+=i
        return [s1-s0,s2-s0]