Single Number通用解法

原创 2017年11月27日 15:33:22

题目:
给定一个整数数组,每个元素出现3次除了一个元素,找到唯一的那个元素。
注意:
算法必须是线性时间复杂度。你能不使用额外的内存实现它吗?

思路:
single numer本质就是用一个数记录每个bit出现的次数,当数的某一位出现了指定次数就归0(本题是3次)。
假设当出现2次就归0时,很容易想到可以使用异或的方法。
然而,当出现2次以上时,我们就需要增加记录的数,因为一个数每个bit,只有0,1两种可能,只能记录两种。
此处我们就需要使用两个数分别secondbit,firstbit来进行记录,可以表示4种可能,本题只需要3种00,01,10。

然后,使用卡诺图来得到secondbit,firstbit的表达式,分别简化secondbit,firstbit为符号f,s则有:

f卡诺图:

sf\A[i] 0 1
00 0 1
01 1 0
10 0 0

因此有: f = (~s&~f&A[i])|(~s&f&~A[i])

s卡诺图:

sf\A[i] 0 1
00 0 0
01 0 1
10 1 0

因此有: s = (~s&f&A[i])|(s&~f&~A[i])

此外当except one 可能出现1次,也可能出现2次。最后的 s f 可能为 00,01,10 结果就是 a|b,有1出现则此位置为1否则为0

    int singleNumber(int A[], int n) {
        int firstbit = 0,secondbit = 0;
        int one = 0;
        for(int i = 0;i < n; i++){
            one = firstbit;
            firstbit = (~secondbit&~firstbit&A[i])|(~secondbit&firstbit&~A[i]);
            secondbit = (~secondbit&one&A[i])|(secondbit&~one&~A[i]);
        }
        return firstbit|secondbit;
    }

用卡诺图化简函数基本步骤:
1. 填入真值表
2. 尽可能画大圈(包含2^n个真值)
3. 把所有真值为1的包括

参考:
SingleNumer问题牛客网讨论
处理SingleNumer的通用方式
卡诺图

版权声明:本文为博主原创文章,未经博主允许不得转载。

Single Number问题及解法

问题描述: Given an array of integers, every element appears twice except for one. Find that single one....
  • u011809767
  • u011809767
  • 2017年03月22日 11:02
  • 82

北邮oj 84 single number

时间限制 1000 ms 内存限制 65536 KB 题目描述 Given an array with N integers where all elements appear three t...
  • sacainiao
  • sacainiao
  • 2016年03月03日 09:22
  • 800

LeetCode || Single Number II

Single Number II  Total Accepted: 12144 Total Submissions: 37399My Submissions Given an ...
  • jiadebin890724
  • jiadebin890724
  • 2014年04月09日 23:35
  • 18958

LintCode贪心法题总结

贪心法的题目主要就考你会不会做,知道就知道,不知道那就很难知道。没啥套路,所以需要把这些题目过一遍。 82. Single Number 一个数组中,每个数字都出现了2次,只有一个数字出现了1次,要求...
  • luoshengkim
  • luoshengkim
  • 2016年08月10日 13:49
  • 478

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

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

136. Single Number [medium] (Python)

题目链接https://leetcode.com/problems/single-number/题目原文 Given an array of integers, every element app...
  • coder_orz
  • coder_orz
  • 2016年07月29日 14:30
  • 1513

LeetCode 136:Single Number I

Single Number Given an array of integers, every element appears twice except for one. Find tha...
  • sunao2002002
  • sunao2002002
  • 2015年05月12日 19:51
  • 3079

SINGLE NUMBER I & II & III

Single Number I : Given an array of integers, every element appears twice except for one. Find th...
  • lcj_cjfykx
  • lcj_cjfykx
  • 2015年09月17日 22:26
  • 1862

LeetCode 137:Single Number II

Given an array of integers, every element appears three times except for one. Find that single one. ...
  • sunao2002002
  • sunao2002002
  • 2015年06月01日 22:36
  • 5019

single-number、single-number2,数组中只出现一次的数字

题目描述:single-number1 一个数组中除了一个数字外,其余数字均出现两次,找出只出现一次的数字。 要求线性复杂度 方法:两个相同的数字异或得0,一个数字和0异或结果是它本身。 pu...
  • jingsuwen1
  • jingsuwen1
  • 2016年05月27日 20:17
  • 350
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Single Number通用解法
举报原因:
原因补充:

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