leetcode初级算法--只出现一次的数字(Python)

题目:给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

思考一:创建一个集合,Python中集合不能重复,第一次见到的数字我都加进集合中,第二次见到就从集合中把她删除,最后集合中就只剩单独的一个数字

class Solution:
    def singleNumber(self, nums: List[int]) -> int:
        qq = set()
        for i in nums:
            if i not in qq:
                qq.add(i)
            else:
                qq.remove(i)
        qq= list(qq)
        return qq[0]

提交结果:思考二:遍历一个数就把那个数删除并在列表中寻找,如果没有说明这个数是唯一的,遍历结束。

class Solution:
    def singleNumber(self, nums: List[int]) -> int:
        nums.sort()
        while True:
            
            p = nums.pop(0)
            if (p not in nums):
                  return p
            else:
                  nums.remove(p)

运行结果:

 同样内存消耗少,但是时间却比上一个多多了

别人的思考和代码:

1、

使用异或运算,将所有值进行异或

异或运算,相异为真,相同为假,所以 a^a = 0 ;0^a = a

因为异或运算 满足交换律 a^b^a = a^a^b = b 所以数组经过异或运算,单独的值就剩下了

class Solution {
    public int singleNumber(int[] nums) {
        int reduce = 0;
        for (int num : nums) {
            reduce =  reduce ^ num;
        }
        return reduce;
    }
}

2、位运算解决

public int singleNumber(int nums[]) {
    int result = 0;
    for (int i = 0; i < nums.length; i++)
        result ^= nums[i];
    return result;
}

3、使用集合set解决

public int singleNumber(int[] nums) {
    Set<Integer> set = new HashSet<>();
    for (int num : nums) {
        if (!set.add(num)) {
            //如果添加失败,说明这个值
            //在集合Set中存在,我们要
            //把他给移除掉
            set.remove(num);
        }
    }
    //最终集合Set中只有一个元素,我们直接返回
    return (int) set.toArray()[0];
}

3、奇数位置与奇数+1位置的元素不相同,则证明奇数位之前存在只出现一次的数字

class Solution:
    def singleNumber(self, nums: List[int]) -> int:
        nums.sort()
        for i in range(0,len(nums),2):
            if(i == len(nums)-1) or nums[i] != nums[i+1]:
                return nums[i]

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

铜雷格局

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值