【LEETCODE OJ】Single Number II
Problem link:
http://oj.leetcode.com/problems/single-number-ii/
The problem seems like the Single Number. Suppose we have following (3m+1) numbers in the array A:
x0, x1, x1, x1, ..., xm, xm, xm
We are asked to find out the value of x0.
However we cannot solve it using XOR since all xi has odd number of appearances.
If we consider the problem as an automata, each time we scan a number from A and update the status of the automata. We consider a integer as an array of bits, and for each number we count the number of "1" for each bit of an integer. Then, after scanning the (3m+1) numbers, for i-th bit, there would be 3k+1 1's (and 3(m-k) 0's) if x0's i-th bit is "1"; otherwise there would be 3k 1's (and 3(m-k)+1 0's). Therefore, if we set the bits having (3k+1) 1's to 1 and other bits to 0, this number should be the same to x0.
We use 3 integers to represent the status of the automata, let's say B0, B1, and B2. For j=0,1,2 and i-th bit, Bj[i] = 1 means the automata has scanned 3k+j numbers with i-th bit set to 1. For each bit there is and only is one "1" in B0, B1, and B2 at any time. That is,
- B0 OR B1 OR B2 = "111........1"
- Bi AND Bj = 0 for i ≠ j
The initial status is as follows,
B0: 1111........1
B1: 0000........0
B2: 0000........0
since there is no numbers scanned yet. Then for each number x, we move the common 1's of x and B0 from B0 to B1, common 1's of x and B1 from B1 to B2, and common 1's of x and B2 from B2 to B0. After scanning all numbers, the value of B1 equals to x0 as we mentioned./p>
The python code is as follows.
class Solution:
# @param A, a list of integer
# @return an integer
def singleNumber(self, A):
"""
Similar to Single Number I,
suppose we have 3m+1 numbers where n0 is the single number:
x0, x1, x1, x1, x2, x2, x2, ..., xm, xm, xm.
We are asked to find out the value of x0.
"""
# special cases:
n = len(A)
assert n > 0
if n == 1:
return A[0] # Bit-counters, with following properties
# 1) bc0 OR bc1 OR bc2 = ~0
# 2) bc0 AND bc1 = 0
# 3) bc1 AND bc2 = 0
# 4) bc0 AND bc2 = 0
bc0 = ~0 # bc0's i-th bit is 1 means there are 3k numbers with i-th bit of 1
bc1 = 0 # bc1's i-th bit is 1 means there are 3k+1 numbers with i-th bit of 1
bc2 = 0 # bc2's i-th bit is 1 means there are 3k+2 numbers with i-th bit of 1 # Scan numbers in A
for x in A:
# Commen bits of bc0 and x
c0 = bc0 & x
# Commen bits of bc1 and x
c1 = bc1 & x
# Commen bits of bc2 and x
c2 = bc2 & x
# Move bits of 1 in c0 from bc0 to bc1,
bc0 &= (~c0)
bc1 |= c0
# Move bits of 1 in c1 from bc1 to bc2
bc1 &= (~c1)
bc2 |= c1
# Move bits of 1 in c2 from bc2 to bc0
bc2 &= (~c2)
bc0 |= c2 return bc1
Actually, we do not need all bc0, bc1, and bc2, since one can be computed from the other two. If then, we only need to update two variables each time and compute another one on-fly. However, I prefer to using 3 variables which is easy to read and understand.
【LEETCODE OJ】Single Number II的更多相关文章
- 【LEETCODE OJ】Single Number
Prolbem link: http://oj.leetcode.com/problems/single-number/ This prolbem can be solved by using XOR ...
- 【LeetCode OJ】Path Sum II
Problem Link: http://oj.leetcode.com/problems/path-sum-ii/ The basic idea here is same to that of Pa ...
- 【LeetCode OJ】Word Ladder II
Problem Link: http://oj.leetcode.com/problems/word-ladder-ii/ Basically, this problem is same to Wor ...
- 【LeetCode OJ】Palindrome Partitioning II
Problem Link: http://oj.leetcode.com/problems/palindrome-partitioning-ii/ We solve this problem by u ...
- 【LeetCode OJ】Word Break II
Problem link: http://oj.leetcode.com/problems/word-break-ii/ This problem is some extension of the w ...
- 【Leetcode 136】Single Number
问题描述:给出一个整数数组,除了一个元素外,其他每个元素都出现了2次,找出只出现1次的元素. int singleNumber(vector<int>& nums); 分析:比较自 ...
- 【题解】【位操作】【Leetcode】Single Number II
Given an array of integers, every element appears three times except for one. Find that single one. ...
- 【leetcode78】Single Number II
题目描述: 给定一个数组,里面除了一个数字,其他的都出现三次.求出这个数字 原文描述: Given an array of integers, every element appears three ...
- 【LeetCode 229】Majority Element II
Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋ times. The algorit ...
随机推荐
- 1029c语言文法2理解
program → external_declaration | program external_declaration <程序>→ <外部声明>|<程序>< ...
- Linux服务器下用svn创建多个项目
(1): 创建svn仓库路径 mkdir -p /opt/svn/project1 mkdir -p /opt/svn/project2 svnadm ...
- Linux GDB常用命令一栏
Linux GDB 常用命令如下: 1.启动和退出gdb (1)启动:gdb ***:显示一段版权说明: (*** 表示可执行程序名) (2)退出:quit.有的时候输入quit后会出现相关提示:类似 ...
- struts2 <s:iterator> status属性
struts2 <s:iterator> status属性 转载▼ iterator标签主要是用于迭代输出集合元素,如list set map 数组等,在使用标签的时候有三个属性值得我 ...
- Idea添加Jetty时提示JMX module is not included
添加自己的jetty时提示下图 此时,我们应该编辑jetty根目录下 start.ini 添加 "--module=jmx" 此时就可以成功添加了 原因:因为在9.07的时候默认情 ...
- C#语言基础——7月21日
C#语言基础 一.语言基础 (一).函数的四要素: 名称,输入,输出,加工(二).主函数.输出语句.输入语句: Static void Main(string[] args)//下划 ...
- 在Oracle中使用rank()over()排名的问题
排序: ---rank()over(order by 列名 排序)的结果是不连续的,如果有4个人,其中有3个是并列第1名,那么最后的排序结果结果如:1 1 1 4 select scoreid, st ...
- java反射之Class.getMethod与getDeclaredMethods()区别
Class对象的getMethods和getDeclaredMethods都是获取类对象的方法.但是又有所不同.废话不多说, 先看demo package com.westward; public c ...
- js 替换 当前URL 特定参数
js 替换 当前URL 特定参数 2012-12-24 20:45:53| 分类: JS&JQuery |举报 |字号 订阅 //替换指定传入参数的值,paramName为参数,repl ...
- 实现js中的重载
重载是面向对象语言里很重要的一个特性,JS中没有真正的重载,是模拟出来的(因为js是基于对象的编程语言,不是纯面向对象的,它没有真正的多态:如继承.重载.重写) 一.什么时候用重载? 举例: func ...