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?

Hide Tags

Bit Manipulation

 

  数组中的数均出现3次,只有1个出现一次,可以参考http://www.cnblogs.com/Azhu/articles/3956568.html 说的。

[解题思路]

k为奇数时,如果k 大于10,就不用转换为2进制了,全部的数的同一位叠加(个位上的数叠加,十位上的叠加,百位上的....),mod k 之后结果放回对应位,便是目标int。

如果k <10,将数组中的数转换成2进制,全部数的同一位叠加,后mod k,得到的结果按位的位置还原成目标int。

 #include <iostream>
using namespace std; class Solution {
public:
int singleNumber(int A[], int n) {
int cnt[]={};
int ret =;
for(int i=;i<n;i++){
int curnum = A[i];
while(curnum){
int idx= __builtin_ffs (curnum);
// cout<<idx<<endl;
cnt[idx]++;
curnum &=curnum-;
}
}
// for(int i=1;i<=32;i++)
// cout<<cnt[i]<<" ";
// cout<<endl;
int a=;
for(int i=;i<=;i++){
ret +=a*(cnt[i]%);
a=a<<;
}
return ret;
}
}; int main()
{
int a[]={,,,};
Solution sol;
cout<<sol.singleNumber(a,sizeof(a)/sizeof(int))<<endl;
return ;
}

discuss 中有一种使用内存更少的,

https://oj.leetcode.com/discuss/6632/challenge-me-thx

public int singleNumber(int[] A) {
int ones = , twos = ;
for(int i = ; i < A.length; i++){
ones = (ones ^ A[i]) & ~twos;
twos = (twos ^ A[i]) & ~ones;
}
return ones;
}

  直观上难理解,只是思路是一样的,转换为二进制,然后每个位上面的数统计,然后mod(3),考虑1位,那么他的变化是

0 -> 1 ->2  -> 0

二进制就是:

00 -> 01  -> 10  ->  00

好了,这样只要两位就可以表示了,代码中的ones  twos ,就这这个意思。

[LeetCode] Single Number II 位运算的更多相关文章

  1. leetcode Single Number II - 位运算处理数组中的数

    题目描述: 给定一个包含n个整数的数组,除了一个数出现一次外所有的整数均出现三次,找出这个只出现一次的整数. 题目来源: http://oj.leetcode.com/problems/single- ...

  2. LeetCode——Single Number II(找出数组中只出现一次的数2)

    问题: Given an array of integers, every element appears three times except for one. Find that single o ...

  3. [LeetCode] Single Number II 单独的数字之二

    Given an array of integers, every element appears three times except for one. Find that single one. ...

  4. LeetCode:Single Number II

    题目地址:here 题目大意:一个整数数组中,只有一个数出现一次,其余数都出现3次,在O(n)时间,O(1)空间内找到这个出现一次的数 对于”只有一个数出现一次,其余数出现2次“的情况,很简单,只要把 ...

  5. [leetcode]Single Number II @ Python

    原题地址:http://oj.leetcode.com/problems/single-number-ii/ 题意:Given an array of integers, every element ...

  6. Leetcode Single Number II (面试题推荐)

    还记得<剑指offer>和<编程之美>等书上多次出现的找一个数组中仅仅出现一次的数那个题吗? leetcode也有这道题 链接here  相信大家都知道用异或在O(n)的时间复 ...

  7. LeetCode | Single Number II【转】

    题目:Given an array of integers, every element appears three times except for one. Find that single on ...

  8. [Leetcode] single number ii 找单个数

    Given an array of integers, every element appears three times except for one. Find that single one. ...

  9. LeetCode Single Number II 单元素2

    题意:给一个序列,其中只有1个元素只出现1次,其他的都一定出现3次.问这个出现一次的元素是多少? 思路: (1)全部元素拆成二进制,那么每个位上的1的个数应该是3的倍数,如果不是3的倍数,则ans的这 ...

随机推荐

  1. form中 单选框 input[type="radio"] 分组

    在form中有时候需要给单选框分组,这种情况下 可以通过给单选框设置相同的name来进行分组: <html> <head> <title> </title&g ...

  2. java设计模式3--观察者模式

    1.初步认识 观察者模式的定义: 在对象之间定义了一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象会收到通知并自动更新. 大白话: 其实就是发布订阅模式,发布者发布信息,订阅者获取信息,订阅了 ...

  3. LeetCode948-令牌放置

    问题:令牌放置 你的初始能量为 P,初始分数为 0,只有一包令牌. 令牌的值为 token[i],每个令牌最多只能使用一次,可能的两种使用方法如下: 如果你至少有 token[i] 点能量,可以将令牌 ...

  4. JS大小转化B KB MB GB的转化方法

    function conver(limit){ var size = ""; ){ //如果小于0.1KB转化成B size = limit.toFixed() + "B ...

  5. 面试前赶紧看了5道Python Web面试题,Python面试题No17

    目录 本面试题题库,由公号:非本科程序员 整理发布 第1题: Flask中的请求上下文和应用上下文是什么? 第2题:django中间件的使用? 第3题: django开发中数据做过什么优化? 第4题: ...

  6. 菜鸟学Linux - 设置文件/文件夹的权限

    在Linux中,我们可以对文件或文件夹设置权限(r,w,x,-).然而,对文件和文件夹的权限设置,具有不同的意义.下面,通过几个例子来了解一下权限的意义所在.在开始之前,我们需要了解几个修改权限的命令 ...

  7. BZOJ 4971: [Lydsy1708月赛]记忆中的背包

    神仙构造 分成x个1和一堆>=w-x的大物品 (x<=20 w>=50) 则拼成w的方案中有且仅有一个大物品 若最终序列中有x个1,有一个大物品为w-k,可以提供C(x,k)种方案 ...

  8. leetcode 【 Reverse Nodes in k-Group 】 python 实现

    原题: Given a linked list, reverse the nodes of a linked list k at a time and return its modified list ...

  9. 使用bat命令实现拖动快速安装APK包

    平时安装APK包,每次都要打命令adb install *********** 很繁琐,网上找到一个用BAT命令快速安装的方法   在桌面创建一个bat文件,输入: @echo off title i ...

  10. PHP 删除 url 中的 query string

    function removeQueryStringFromUrl($url) { if (substr($url,0,4) =="http") { $urlPartsArray ...