Leetcode 137. Single Number II JAVA语言
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;
}
}
|
Leetcode 137. Single Number II JAVA语言相关推荐
- 【异或】LeetCode 137. Single Number II
LeetCode 137. Single Number II Solution1:不会做,抄的 博客转载自:http://www.cnblogs.com/grandyang/p/4263927.htm ...
- Leetcode #137 Single Number II
题目链接:https://leetcode.com/problems/single-number-ii/ 题意表明有一个数字出现了一次,其他数字出现了三次,那么实现一个模3的计数器即可. 1 clas ...
- LeetCode 137.Single Number II 只出现一次的数字 II
题目描述 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次.找出那个只出现了一次的元素. 说明: 你的算法应该具有线性时间复杂度. 你可以不使用额外空间来实现吗? 示例 1: ...
- LeetCode 137. Single Number II--三次异或消除相同的数--C++,Python解法
题目地址:Single Number II - LeetCode Given a non-empty array of integers, every element appears three ti ...
- 137 Single Number II 数组中除了一个数外,其他的数都出现了三次,找出这个只出现一次的数...
给定一个整型数组,除了一个元素只出现一次外,其余每个元素都出现了三次.求出那个只出现一次的数. 注意: 你的算法应该具有线性的时间复杂度.你能否不使用额外的内存来实现? 详见:https://leet ...
- LEETCODE 137.Singel Number ii
Given an array of integers, every element appears three times except for one. Find that single one. ...
- [LeetCode]Single Number II
今天室友推荐了一道LeetCode上面的练习题Single Number II,题目大概的意思是有一个整形的数组,里面只有一个数是出现一次的,其他的数都出现了三次,然后让把这个数找出来. 第一眼看到这 ...
- Single Number II(LintCode)
Single Number II Given 3*n + 1 numbers, every numbers occurs triple times except one, find it. Examp ...
- 【?异或】LeetCode 260. Single Number III
LeetCode 260. Single Number III Solution1: 博客转载自:http://www.cnblogs.com/grandyang/p/4741122.html 这道题 ...
最新文章
- plsql programming 18 包
- jmeter(五)几种不同的content-type方式
- 什么时候html的过渡版本,CSS过渡与转换
- 安卓键盘加上数字_Android自定义键盘的实现(数字键盘和字母键盘)
- 大班如果我有机器人教案_幼儿园大班教案《小猴投彩球》
- uiwebview 编辑html5,【iOS】UIWebView HTML5 扩展
- thinkphp中的__DIR__ __ROOT__ __APP__ __MODULE__ APP_PATH LIB_PATH MODULE_PATH 等是在哪里定义的?...
- 用Aria2加速下载数据集等
- 材料学真的没前途吗?
- RealSense D435i数据录制 VINS离线运行
- 无法支持计算机上的硬件,win7“不支持的硬件,你的电脑使用的处理器专为最新版win...
- 给我计算机病毒的代码,常用的电脑病毒代码
- python docx 提取图片_Python提取docx文档中所有嵌入式图片和浮动图片
- 【系统分析师之路】2014年系统分析师上午综合知识真题
- Redis学习之设置验证密码
- vue中v-for写在template上,不能加key怎么办
- canvas四个点画矩形,中垂线,以及顶点拖拽
- 小游戏 虚拟支付 米大师 90009
- 纯思考:主观和客观中的观察者
- disabled=true
热门文章
- java定义final_Java中何时将方法声明为final的
- seurat提取表达矩阵_单细胞数据分析神器——Seurat
- php对手时间戳判断,PHP 中判断一个数字是否是Unix 时间戳
- python 文件 解析ddl_使用python中的cx_Oracle使用PL / SQL和DML / DDL解析SQL文件
- windows服务器双网卡链路聚合_基于windows server 2012的多网卡链路聚合实验设计与......
- 设置android电话震动,Android手机震动的设置步骤
- 【项目管理】影响项目裁剪主要属性
- 《系统集成项目管理工程师》必背100个知识点-60干系人管理
- Leaflet中使用Leaflet.Graticule插件实现添加矩形格网
- 鸿蒙开发目录结构及文件使用规则介绍