70 leetcode - Single Number I,II,III

原创 2017年01月03日 10:46:10

Single Number I

#!/usr/bin/python
# -*- coding: utf-8 -*-
'''
Single Number
Given an array of integers, every element appears twice except for one. Find that single one.
'''
class Solution(object):
    def singleNumber(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        length = len(nums)
        if length == 0:
            return 0
        if length == 1:
            return nums[0]

        return reduce(lambda x,y:x^y,nums)

Single Number II

#!/usr/bin/python
# -*- coding: utf-8 -*-
'''
Single Number II
Given an array of integers, every element appears three times except for one. Find that single one.
Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
实现的思路是基于数组的元素是整数,统计整数的每一位来得到出现次数。
我们知道如果每个元素重复出现三次,那么每一位出现1的次数也会是3的倍数,
如果我们统计完对每一位进行取余3,那么结果中就只剩下那个出现一次的元素。
总体只需要对数组进行一次线性扫描,统计完之后每一位进行取余3并且将位数字赋给结果整数,
这是一个常量操作(因为整数的位数是固定32位),所以时间复杂度是O(n)。而空间复杂度需要一个32个元素的数组,也是固定的,因而空间复杂度是O(1)
'''
class Solution(object):
    def singleNumber(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        length = len(nums)
        if length == 0:
            return 0

        bit_sum = [0] * 32
        for val in nums:
            for index in range(32):
                bit_sum[index] += (val >> index) & 1

        ret = 0
        #print bit_sum
        for index,val in enumerate(bit_sum[:-1]):
            ret += (val%3)<<index
        if bit_sum[-1]%3 == 1:
            return -(pow(2,31) - ret)
        return ret

if __name__ == "__main__":
    s = Solution()
    print s.singleNumber([1,3,3,3])
    print s.singleNumber([1])
    print s.singleNumber([-2,-2,1,1,-3,1,-3,-3,-4,-2])
    print s.singleNumber([-401451,-177656,-2147483646,-473874,-814645,-2147483646,-852036,-457533,-401451,-473874,-401451,-216555,-917279,-457533,-852036,-457533,-177656,-2147483646,-177656,-917279,-473874,-852036,-917279,-216555,-814645,2147483645,-2147483648,2147483645,-814645,2147483645,-216555])

Single Number III

#!/usr/bin/python
# -*- coding: utf-8 -*-
'''
Single Number III
Given an array of numbers nums, in which exactly two elements appear only once and all the other elements appear exactly twice. Find the two elements that appear only once.
For example:
Given nums = [1, 2, 1, 3, 2, 5], return [3, 5].
Note:
The order of the result is not important. So in the above example, [5, 3] is also correct.
Your algorithm should run in linear runtime complexity. Could you implement it using only constant space complexity?
'''
class Solution(object):
    def __single(self,nums):
        ret = nums[0]
        for i in nums[1:]:
            ret = ret ^ i

        return ret

    def singleNumber(self, nums):
        """
        :type nums: List[int]
        :rtype: List[int]
        """
        length = len(nums)
        if length <= 2:
            return nums

        #两个只出现一次的数异或
        tmp = self.__single(nums)     

        diff_index = 0
        #寻找能区分两个数的那一位,因为tmp做的是异或
        while diff_index < 32:        
            if (tmp >> diff_index) & 1:
                break

            diff_index += 1

        #转换成了一个数组中有一个数出现一次,其余出现两次
        ret1 = ret2 = 0
        for i in nums:
            if (i>>diff_index) & 1:
                ret1 = ret1 ^ i
            else:
                ret2 = ret2 ^ i

        return [ret1,ret2]

if __name__ == "__main__":
    s = Solution()
    print s.singleNumber([1,2,3,3,4,4,2,5,5,10])
版权声明:本文为博主原创文章,如果转载请标明出处,谢谢- -!...如有错误,请大家帮忙指正...联系邮箱401865981@qq.com

LeetCode 260 Single Number III(只出现一次的数字 III)(*)

原文给定一个数字数组nums,其中有两个元素只出现一次,而其他所有元素均出现两次。找出这两个只出现一次的元素。例如:给定nums = [1, 2, 1, 3, 2, 5],返回[3, 5]。备注: 1...
  • NoMasp
  • NoMasp
  • 2016年02月18日 15:06
  • 4414

【LeetCode-面试算法经典-Java实现】【137-Single Number II(只字出一次的数字II)】

【137-Single Number II(只出现一次的数字II)】【LeetCode-面试算法经典-Java实现】【所有题目目录索引】原题  Given an array of integers, ...
  • DERRANTCM
  • DERRANTCM
  • 2015年08月18日 06:24
  • 3904

Micrium 开放了µC/OS-III源代码

Micrium 开放了µC/OS-III源代码  发布时间:2011-8-19 9:27:29   发布方:Dave   点击数:1641 高品质嵌入式系统...
  • autumn20080101
  • autumn20080101
  • 2013年07月25日 15:29
  • 1460

<LeetCode OJ> 136 / 137 / 260 Single Number(I / II / III)

260. Single Number III My Submissions Question Total Accepted: 19802 Total Submissions: 47891 Di...
  • EbowTang
  • EbowTang
  • 2016年01月01日 16:11
  • 987

LeetCode:Single Number I & II & III

(一)题目描述:single-number Given an array of integers, every element appears **twice** except for one. Fi...
  • u011489043
  • u011489043
  • 2017年03月21日 14:26
  • 251

Single Number I+II+III

Expected:linear runtime complexity, constant space complexity.(像当初的我直接用关联容器暴力解决…)Single Number IGiv...
  • qq_20581563
  • qq_20581563
  • 2016年04月29日 17:31
  • 319

leetcode136:single number I&II 及拓展

Single Number I给定一个数组,除了一个元素出现一次之外,其余的元素都出现两次。找出这个元素分析:只要将所有的元素都异或一次,最后的结果就是这个出现一次数。代码:int singleNum...
  • hjxzb
  • hjxzb
  • 2015年04月24日 10:31
  • 572

LeetCode Single Number I & II 都符合两个问题额外要求的 通用解法 与 思考过程

首先本能地想到一个算法,可是脑子一转,觉得是要O(n*n)时间复杂度。编译一下,果然没通过。程序如下:不过我觉得本算法最简单,而且通用性是最好的。 然后搜肠刮肚想想那个算法可以优化为时间O(n)的复杂...
  • kenden23
  • kenden23
  • 2013年11月02日 07:33
  • 20522

LeetCode Single Number I & II

Single Number  Total Accepted: 18499 Total Submissions: 41204My Submissions Given an arr...
  • kiki_yu
  • kiki_yu
  • 2014年04月22日 21:28
  • 481

LeetCode(41) Single Number I 和 II

题目描述Given an array of integers, every element appears twice except for one. Find that single one.如果一...
  • angelazy
  • angelazy
  • 2015年09月23日 10:48
  • 297
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:70 leetcode - Single Number I,II,III
举报原因:
原因补充:

(最多只允许输入30个字)