• 【每日一句】只出现一次的数


    Tag

    位运算-异或和】【数组】【2023-10-14】


    题目来源

    136. 只出现一次的数字


    题目解读

    给你一个数组,找出数组中只出现一次的元素。题目保证仅有一个元素出现一次,其余的元素都是出现两次的。

    要求解题方法的时间复杂度为线性的,空间复杂度为常数级别。


    解题思路

    如果不考虑时间复杂度与空间复杂度,本题有多种解决方法,比如哈希表记录每个元素出现的次数;比如使用集合记录元素,如果遇到第二次个元素,则从集合中移除遍历到的元素,最后集合中剩余的就是仅出现一次的元素。还有一种方法就是将数组中的元素全部放入集合中,利用集合来去重,集合中的数都是出现过一次的数,现在将集合中元素和的二倍减去数组中元素和,得到的结果就是数组中仅出现一次的元素。

    本题的最优解法是位运算的方法。

    方法一:位运算

    本题利用的是位运算的异或和知识,我们知道:

    • 两个相同的数的异或和为 0
    • 任何数与 0 异或,结果不变;
    • 异或操作具有交换性。

    利用以上异或和的三条性质,我们可以这样解决本题:

    • 维护一个结果变量 res,初始值为 0
    • 遍历数组中的所有元素,与 0 进行异或操作,相同元素之间的异或和为 0,最后只剩下 0 数组中的出现过一次的数异或,得到的就是数组中的出现过一次的数;
    • 返回 res

    实现代码

    class Solution {
    public:
        int singleNumber(vector<int>& nums) {
            int res = 0;
            for (int num : nums) {
                res ^= num;
            }
            return res;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    复杂度分析

    时间复杂度: O ( n ) O(n) O(n) n n n 为数组 nums 的长度。

    空间复杂度: O ( 1 ) O(1) O(1)


    其他语言

    C

    int singleNumber(int* nums, int numsSize){
        int res = 0;
        for (int i = 0; i < numsSize; ++i) {
            res ^= nums[i];
        }
        return res;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    python3

    class Solution:
        def singleNumber(self, nums: List[int]) -> int:
            ret = 0
            for i in nums:
                ret ^= i
            return ret
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    写在最后

    如果文章内容有任何错误或者您对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。

    如果大家有更优的时间、空间复杂度方法,欢迎评论区交流。

    最后,感谢您的阅读,如果感到有所收获的话可以给博主点一个 👍 哦。

  • 相关阅读:
    Django中的ajax细节
    基于Druid的HiveSQL血缘解析
    [附源码]java毕业设计智能超市导购系统
    CSS 基础
    hive从入门到放弃(二)——DDL数据定义
    08-CSS中的position定位&盒子水平垂直居中
    Python3: range()可迭代对象 2023-11-15
    Mybaits一级缓存和二级缓存分别是什么,区别是什么?
    golang中的select原理解析
    360数字安全:2024年3月勒索软件流行态势分析报告
  • 原文地址:https://blog.csdn.net/weixin_54383080/article/details/133820352