[leetcode]Single Number II @ Python
原题地址:http://oj.leetcode.com/problems/single-number-ii/
题意:Given an array of integers, every element appears three times except for one. Find that single one.
要求:和single number一样,线性时间复杂度,不能使用额外空间。
解题思路:这道题就比较难了。也是考察位操作。网上的位操作解法看了好半天也没有得其精髓。由于序列中除了那唯一的一个数之外所有的数都是三个三个出现的。如果把这些数都转换成二进制,那么二进制数中1的那些位会连续出现三次,我们可以利用这个思路来解题。比如:3331222转换成二进制为:11 11 11 01 10 10 10。在第1位上,1出现了4次。第2位上,1出现了6次。那么我们把每一位上为1的个数mod 3剩下的1就是我们所求的数,比如这个例子:4 mod 3 = 1; 6 mod 3 = 0。这样剩下的二进制位为:01。那最后所求的数就是1了。
那怎么实现这个想法呢?使用二进制模拟三进制。在连续来3个1后清0。使用两个bit位,bit1和bit2。初始状态bit1和bit2都是0,即00,在来了第一个1后,变成了01,来了第二个1后变成了10,来了第三个1后,变成了11,然后清0为00,即:00->01->10->11,然后将11清为00,这个过程就是我们编程的思路。比如如果输入序列为:1 1 1 1 1 1 1,则变化过程为:00->01->10->11->00->01->10->11->00->01,最后剩下的是1,也就得到了结果。如果位数多那么以此类推,比如序列为:3 3 3 2 2 2 1。则二进制为:11 11 11 10 10 10 01。则低位为1 1 1 0 0 0 1,变化过程为:00->01->10->11->00->00->00->00->01,所以低位剩下1。高位为:1 1 1 1 1 1 0,变化过程为:00->01->10->11->00->01->10->11->00->00,所以高位剩下0。那么最后剩下的是01,也就是1。如果位数更多,可以以此类推。程序中的one相当于bit1,two相当于bit2。
代码:
class Solution:
# @param A, a list of integer
# @return an integer
def singleNumber(self, A):
one = 0; two = 0; three = 0
for i in range(len(A)):
two |= A[i] & one #two为1时,不管A[i]为什么,two都为1
one = A[i] ^ one #异或操作,都是1就进位
three = ~(one & two) #以下三步的意思是:如果one和two都为1时,就清0,反之则保持原来状态。
one &= three
two &= three
return one
以上是网上的精髓解法,我自己还有个弱智的解法,供参考:
def singleNumber(self, A):
dict = {}
for i in range(len(A)):
if A[i] not in dict:
dict[A[i]] = 1
else:
dict[A[i]] += 1
for word in dict:
if dict[word] == 1:
return word
[leetcode]Single Number II @ Python的更多相关文章
- [LeetCode] Single Number II 单独的数字之二
Given an array of integers, every element appears three times except for one. Find that single one. ...
- LeetCode——Single Number II(找出数组中只出现一次的数2)
问题: Given an array of integers, every element appears three times except for one. Find that single o ...
- LeetCode:Single Number II
题目地址:here 题目大意:一个整数数组中,只有一个数出现一次,其余数都出现3次,在O(n)时间,O(1)空间内找到这个出现一次的数 对于”只有一个数出现一次,其余数出现2次“的情况,很简单,只要把 ...
- [Leetcode] single number ii 找单个数
Given an array of integers, every element appears three times except for one. Find that single one. ...
- [LeetCode] Single Number II 位运算
Given an array of integers, every element appears three times except for one. Find that single one. ...
- Leetcode Single Number II (面试题推荐)
还记得<剑指offer>和<编程之美>等书上多次出现的找一个数组中仅仅出现一次的数那个题吗? leetcode也有这道题 链接here 相信大家都知道用异或在O(n)的时间复 ...
- LeetCode | Single Number II【转】
题目:Given an array of integers, every element appears three times except for one. Find that single on ...
- LeetCode——Single Number II
Description: Given an array of integers, every element appears three times except for one. Find that ...
- leetcode Single Number II - 位运算处理数组中的数
题目描述: 给定一个包含n个整数的数组,除了一个数出现一次外所有的整数均出现三次,找出这个只出现一次的整数. 题目来源: http://oj.leetcode.com/problems/single- ...
随机推荐
- react篇章-React State(状态)-组件都是真正隔离的
<!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title&g ...
- Django Q对象
使用Q 对象进行复杂的查询¶ filter() 等方法中的关键字参数查询都是一起进行“AND” 的. 如果你需要执行更复杂的查询(例如OR 语句),你可以使用Q 对象. Q 对象 (django.db ...
- 【CF540D】 D. Bad Luck Island (概率DP)
D. Bad Luck Island time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- centOS7 apache ssl证书安装配置
背景说明:服务器是centOS7.4 七牛申请的免费ssl证书 默认apache是没有安装SSL模块的,所以需要安装,接着使用命令: yum install -y mod_ssl apache目录 / ...
- css平移动画的实现
参考这位大佬的帖子:https://www.jianshu.com/p/5d8e77ef7f84
- PHP中CGI,FastCGI,PHP-CGI与PHP-FPM对比
CGI CGI全称是“公共网关接口”(Common Gateway Interface),HTTP服务器与你的或其它机器上的程序进行“交谈”的一种工具,其程序须运行在网络服务器上. CGI可以用任何一 ...
- 20162318 2018-2019-2《网络对抗技术》Exp1 PC平台逆向破解
一.实验目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 该程序同时包含另一个代码片段,getS ...
- 【BZOJ】4260: Codechef REBXOR【Trie树】【前后缀异或最大】
4260: Codechef REBXOR Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 2218 Solved: 962[Submit][Stat ...
- brainfuck 解释器
#include <cstdio>#include <cmath>#include <cstring>#include <ctime>#include ...
- Oracle SP2-0640
安装Oracle database 11g express edition后,使用自带的SQL命令行,执行 select 1 from dual; 报出错误:SP2-0640 未连接 解决方法:使用 ...