- 2016.10.09启程。。
Algorithms
Bit Manipulation
136. Single Number
Leetcode 题目链接
Given an 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?
# Time: O(n)
# Space: O(1)
#
# Given an 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?
#
import operator
class Solution:
# @param A, a list of integer
# @return an integer
def singleNumber(self, A):
return reduce(operator.xor, A)
if __name__ == '__main__':
print Solution().singleNumber([1, 1, 2, 2, 3])
异或
A B ⊕
F F F
F T T
T F T
T T F
operator.xor(a, b) operator.xor(a, b)
Return the bitwise exclusive or of a and b.
Reduce is a really useful function for performing some computation on a list and returning the result
Reduce连续作用在整个list, 异或运算对每出现两个相同的数字,返回值将为0. 余下的数字将会是只出现过一次的数字。
137. Single Number II
LeetCode题目链接
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?
# Time: O(n)
# Space: O(1)
#
# 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?
#
class Solution:
# @param A, a list of integer
# @return an integer
def singleNumber(self, A):
one, two = 0, 0
for x in A:
one, two = (~x & one) | (x & ~one & ~two), (~x & two) | (x & one)
return one
class Solution2:
# @param A, a list of integer
# @return an integer
def singleNumber(self, A):
one, two, carry = 0, 0, 0
for x in A:
two |= one & x
one ^= x
carry = one & two
one &= ~carry
two &= ~carry
return one
if __name__ == "__main__":
print Solution().singleNumber([1, 1, 1, 2, 2, 2, 3])
拓展
every element appears 4 times except for one with 2 times
class SolutionEX:
# @param A, a list of integer
# @return an integer
# [1, 1, 1, 1, 2, 2, 2, 2, 3, 3]
def singleNumber(self, A):
one, two, three = 0, 0, 0
for x in A:
one, two, three = (~x & one) | (x & ~one & ~two & ~three), (~x & two) | (x & one), (~x & three) | (x & two)
return two
还不明白,,,