自学内容网 自学内容网

C语言刷题 LeetCode 30天挑战 (一)

LeetCode C language train,Day1 

issue
Given a non-empty array of integers, every element appears twice except for one. Find that single one
Your algorithm should have a linear runtime complexity, Could you implement it without using extra memory?
Input:[2,2,1]                Output:1
Input:[4,1,2,1,2]          Output:4

Function prototypes

int singleNumber(int *nums,int numsSize){
}

写法1:

int singleNumber(int *nums,int numsSize){
    for (int i=0 ; i<numsSize ; ++i){  
        int count = 0;
        for ( int j=0 ; j<numsSize ; ++j ){
            if(nums[i] == nums[j]){
                count++;
            }
        }
        if(count == 1)
            return nums[i];
    }
    return -1;
}

时间复杂度高,当前实现的时间复杂度是 O(n^2),因为它使用了两个嵌套循环来检查每个元素的出现次数。这在 numsSize 较大时会导致性能问题。(我们可以通过空间去换时间,这种办法后续也会提到)

返回值问题:如果输入数组中没有唯一的数字,函数会返回 -1,这可能不是一个合理的返回值,因为它可能与数组中的有效数据冲突。

写法2:

int singleNumber2(int *nums, int numsSize) {
    int result = nums[0];
    for (int i = 1; i < numsSize; ++i) {
        result ^= nums[i];
    }
    return result;
}

在异或运算中,成对的数字会相互抵消(例如,x ^ x = 0),而唯一的数字会保留在 result 中。

可以看到下述内容


原文地址:https://blog.csdn.net/weixin_64593595/article/details/142500452

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!