8.12 练手 腾讯50题 136

Leetcode 136. Single Number

Given a non-empty array of integers, every element appears twice except for one. Find that single one.

Note:

Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?

Example 1:

Input: [2,2,1]
Output: 1

Example 2:

Input: [4,1,2,1,2]
Output: 4

要求线性时间,并且空间复杂度为1,因此只能考虑在原来的数组中做运算,想法是直接异或所有数,其中要单独考虑最后剩下0的异或,不然可能会有 0^0=1的状况,因此提前 remove(0),代码如下:

class Solution(object):
    def singleNumber(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        
        if(len(nums) == 1):
            return nums[0]
        if 0 in nums:
            nums.remove(0)
        
        result = 0
        for i in nums:
            result = result ^ i # 0^i=i , i^i=0
            
        return result 

 

Discuss中的解法:

1.运算法:

就很神奇,巧妙用了set()

2∗(a+b+c)−(a+a+b+b+c)=c

代码如下:

class Solution(object):
    def singleNumber(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        return 2 * sum(set(nums)) - sum(nums)

2.hash表

用字典的key和point来做桶和值,很巧妙

def singleNumber1(self, nums):
    dic = {}
    for num in nums:
        dic[num] = dic.get(num, 0)+1
    for key, val in dic.items():
        if val == 1:
            return key

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值