1
2
3
Given an array of integers, every element appears three times except for one, which appears exactly once. Find that single one.
Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?

题意:一个数组中除了一个数出现一次之外,其他数都出现了三次!!找出那个出现一次的数字!!!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Solution {
    public int singleNumber(int[] nums) {
        int ret=0;
        int[] count=new int[32];
        int len=nums.length;
        for(int i=0;i<32;i++){
            for(int j=0;j<len;j++){
            //统计所有数字第i位0,1的和。通过右移与1做&运算得到!!!!!!
                count[i]+=((nums[j]>>i)&1);
             然后把对于位的和取模3就得到了single数字的第i位哦
                count[i]=count[i]%3;
            }
            因为之前左移了i位,所以现在右移回来,然后与0做或|运算
            所有的1就可以归为了!!!!!我曹真是6666
            ret |=(count[i]<<i);
        }
        return ret;
    }
}

PS:本来看了左老师的书,本来以为可以用K进制无进位加法做来着。详情见左老师书。但是不知道为什么不能通过。所以就上网扒拉了一个比较通用的方法。

输入是int型数组,所以可以用32位来表达输入数组的元素。
假设输入中没有single number,那么输入中的每个数字都重复出现了数字,也就是说,对这32位中的每一位i而言,所有的输入加起来之后,第i位一定是3的倍数。
现在增加了single number,那么对这32位中的每一位做相同的处理,也就是说,逐位把所有的输入加起来,并且看看第i位的和除以3的余数,这个余数就是single numer在第i位的取值。这样就得到了single number在第i位的取值。这等价于一个模拟的二进制,接着只需要把这个模拟的二进制转化为十进制输出即可。
为了完成上面的过程,需要使用一个数组 int a[ 32 ]来模拟位运算。
可以看出来,这个做法对于功力的要求非常高,需要看到数字的时候,眼前展现的是数字背后的二进制组成,要不然很难想到可以逐位去处理。
另外,这个做法可以扩展,如果有一堆输入,其中1个数字出现了1次,剩下的数字出现了K次,这样的问题全部可以使用这样的办法来做。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
public class Solution {
    public int singleNumber(int[] nums) {
        //if(nums==null || nums.length<4)return 0;
        int[] ret=new int[32];
        for(int i=0;i!=nums.length;i++){
            sum3(ret,nums[i]);
        }
        return gain101(ret);
         
    }
    public static void sum3(int[] ret,int nums){
        // int[] ret=new int[32];
        // for(int i=0;i<nums.length;i++){
        //   int[] cur=to3(nums[i]);
        //     for(int j=0;j<cur.length;j++){
        //         ret[j]=(ret[j]+cur[j])%3;
        //      }  
        // }
        int[] cur=to3(nums);
        for(int i=0;i!=ret.length;i++){
            ret[i]=(ret[i]+cur[i])%3;
        }
        //return ret;
    }
    public static int[] to3(int num){
        int[] ret=new int[32];
        int index=0;
        while(num!=0){
            ret[index++]=num%3;
            num=num/3;
        }
        return ret;
    }
    // public static int gain10(int[] arr){
    //     int ret=0;
    //     int temp=0;
    //     for(int i=0;i<arr.length;i++){
    //         temp=(int)Math.pow(3,i);
    //         ret=ret+arr[i]*temp;
    //     }
    //     return ret;
    // }
    public static int gain101(int[] arr){
        int ret=0;
        for(int i=arr.length-1;i!=-1;i--){
            ret=ret*3+arr[i];
        }
        return ret;
    }
}

本文转自 努力的C 51CTO博客,原文链接:http://blog.51cto.com/fulin0532/1908498

Leetcode 137. Single Number II JAVA语言相关推荐

  1. 【异或】LeetCode 137. Single Number II

    LeetCode 137. Single Number II Solution1:不会做,抄的 博客转载自:http://www.cnblogs.com/grandyang/p/4263927.htm ...

  2. Leetcode #137 Single Number II

    题目链接:https://leetcode.com/problems/single-number-ii/ 题意表明有一个数字出现了一次,其他数字出现了三次,那么实现一个模3的计数器即可. 1 clas ...

  3. LeetCode 137.Single Number II 只出现一次的数字 II

    题目描述 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次.找出那个只出现了一次的元素. 说明: 你的算法应该具有线性时间复杂度. 你可以不使用额外空间来实现吗? 示例 1: ...

  4. LeetCode 137. Single Number II--三次异或消除相同的数--C++,Python解法

    题目地址:Single Number II - LeetCode Given a non-empty array of integers, every element appears three ti ...

  5. 137 Single Number II 数组中除了一个数外,其他的数都出现了三次,找出这个只出现一次的数...

    给定一个整型数组,除了一个元素只出现一次外,其余每个元素都出现了三次.求出那个只出现一次的数. 注意: 你的算法应该具有线性的时间复杂度.你能否不使用额外的内存来实现? 详见:https://leet ...

  6. LEETCODE 137.Singel Number ii

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

  7. [LeetCode]Single Number II

    今天室友推荐了一道LeetCode上面的练习题Single Number II,题目大概的意思是有一个整形的数组,里面只有一个数是出现一次的,其他的数都出现了三次,然后让把这个数找出来. 第一眼看到这 ...

  8. Single Number II(LintCode)

    Single Number II Given 3*n + 1 numbers, every numbers occurs triple times except one, find it. Examp ...

  9. 【?异或】LeetCode 260. Single Number III

    LeetCode 260. Single Number III Solution1: 博客转载自:http://www.cnblogs.com/grandyang/p/4741122.html 这道题 ...

最新文章

  1. plsql programming 18 包
  2. jmeter(五)几种不同的content-type方式
  3. 什么时候html的过渡版本,CSS过渡与转换
  4. 安卓键盘加上数字_Android自定义键盘的实现(数字键盘和字母键盘)
  5. 大班如果我有机器人教案_幼儿园大班教案《小猴投彩球》
  6. uiwebview 编辑html5,【iOS】UIWebView HTML5 扩展
  7. thinkphp中的__DIR__ __ROOT__ __APP__ __MODULE__ APP_PATH LIB_PATH MODULE_PATH 等是在哪里定义的?...
  8. 用Aria2加速下载数据集等
  9. 材料学真的没前途吗?
  10. RealSense D435i数据录制 VINS离线运行
  11. 无法支持计算机上的硬件,win7“不支持的硬件,你的电脑使用的处理器专为最新版win...
  12. 给我计算机病毒的代码,常用的电脑病毒代码
  13. python docx 提取图片_Python提取docx文档中所有嵌入式图片和浮动图片
  14. 【系统分析师之路】2014年系统分析师上午综合知识真题
  15. Redis学习之设置验证密码
  16. vue中v-for写在template上,不能加key怎么办
  17. canvas四个点画矩形,中垂线,以及顶点拖拽
  18. 小游戏 虚拟支付 米大师 90009
  19. 纯思考:主观和客观中的观察者
  20. disabled=true

热门文章

  1. java定义final_Java中何时将方法声明为final的
  2. seurat提取表达矩阵_单细胞数据分析神器——Seurat
  3. php对手时间戳判断,PHP 中判断一个数字是否是Unix 时间戳
  4. python 文件 解析ddl_使用python中的cx_Oracle使用PL / SQL和DML / DDL解析SQL文件
  5. windows服务器双网卡链路聚合_基于windows server 2012的多网卡链路聚合实验设计与......
  6. 设置android电话震动,Android手机震动的设置步骤
  7. 【项目管理】影响项目裁剪主要属性
  8. 《系统集成项目管理工程师》必背100个知识点-60干系人管理
  9. Leaflet中使用Leaflet.Graticule插件实现添加矩形格网
  10. 鸿蒙开发目录结构及文件使用规则介绍