题目链接

题目大意:给出一串数组,里面的数都是两个,只有一个数是一个,把这个只有一个的数找出来。时间复杂度最好是线性的,空间复杂度最好为O(1).

法一:利用map,空间换时间,代码如下(耗时26ms):

     public int singleNumber(int[] nums) {
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
int res = -1;
for(int i = 0; i < nums.length; i++) {
if(map.get(nums[i]) != null && map.get(nums[i]) == 1) {
map.put(nums[i], 2);
}
else {
map.put(nums[i], 1);
}
}
for(int i = 0; i < nums.length; i++) {
if(map.get(nums[i]) == 1) {
res = nums[i];
break;
}
}
return res;
}

法二:先排序,再一个for循环,依次比较,代码如下(耗时8ms):

     public int singleNumber(int[] nums) {
Arrays.sort(nums);
int res = nums[0];
int cnt = 1;
boolean flag = false;
for(int i = 1; i < nums.length; i++) {
if(nums[i] != nums[i - 1]) {
if(cnt == 1) {
res = nums[i - 1];
flag = true;
break;
}
cnt = 1;
}
else {
cnt++;
}
}
if(flag == false) {
res = nums[nums.length - 1];
}
return res;
}

法三(借鉴):利用异或,由3^3=0知道,相同的两个数异或为0,不同的两个数异或为1。代码如下(耗时1ms):

     public int singleNumber(int[] nums) {
int res = nums[0];
for(int i = 1; i < nums.length; i++) {
res = res ^ nums[i];
}
return res;
}

法四(借鉴):利用137题的法三,位运算,只是把对3取模改成对2取模即可。(num>>i)&1取num的第i位二进制数。ans |= sum <<i将二进制相加转为十进制。代码如下(耗时12ms):

     public int singleNumber(int[] nums) {
int ans = 0;
int length = nums.length;
//将每一个数取二进制位按位相加,如果都是重复的则当前位的相加和一定是3的倍数,否则当前位一定存在于要找的那个数中
//比如1,1,1,2,2,2,3这六个数将其转为二进制数按位相加,然后每一位都对3取模,最后一定可以得到3
for(int i = 0; i < 32; i++) {//计算每一位
int sum = 0;//统计每一位的和
for(int j = 0; j < length; j++) {//对每个数取第i位的数值
if(((nums[j] >> i) & 1) == 1) {//取第i位的数值
sum++;//将每个数第i位的值相加求和
sum %= 2;
}
}
if(sum != 0) {//如果对3取模后非0,则说明当前位一定是要找的数的某一位
ans |= sum << i;//将其转为十进制加入结果当中
}
}
return ans;
}

136.Single Number---异或、位运算的更多相关文章

  1. leetcode 136 Single Number, 260 Single Number III

    leetcode 136. Single Number Given an array of integers, every element appears twice except for one. ...

  2. leetcode 136. Single Number 、 137. Single Number II 、 260. Single Number III(剑指offer40 数组中只出现一次的数字)

    136. Single Number 除了一个数字,其他数字都出现了两遍. 用亦或解决,亦或的特点:1.相同的数结果为0,不同的数结果为1 2.与自己亦或为0,与0亦或为原来的数 class Solu ...

  3. LeetCode 136. Single Number C++ 结题报告

    136. Single Number -- Easy 解答 相同的数,XOR 等于 0,所以,将所有的数字 XOR 就可以得到只出现一次的数 class Solution { public: int ...

  4. LeetCode 136. Single Number(只出现一次的数字)

    LeetCode 136. Single Number(只出现一次的数字)

  5. 136. Single Number - LeetCode

    Question 136. Single Number Solution 思路:构造一个map,遍历数组记录每个数出现的次数,再遍历map,取出出现次数为1的num public int single ...

  6. LeetCode - 136. Single Number - ( C++ ) - 解题报告 - 位运算思路 xor

    1.题目大意 Given an array of integers, every element appears twice except for one. Find that single one. ...

  7. 【LeetCode】136. Single Number 解题报告(Java & Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 异或 字典 日期 [LeetCode] 题目地址:h ...

  8. Leetcode 136 Single Number 仅出现一次的数字

    原题地址https://leetcode.com/problems/single-number/ 题目描述Given an array of integers, every element appea ...

  9. 【LeetCode】136. Single Number (4 solutions)

    Single Number Given an array of integers, every element appears twice except for one. Find that sing ...

随机推荐

  1. hadoop和spark搭建记录

    因玩票需要,使用三台搭建spark(192.168.1.10,192.168.1.11,192.168.1.12),又因spark构建在hadoop之上,那么就需要先搭建hadoop.历经一个两个下午 ...

  2. P2766 最长不下降子序列问题

    题目描述 «问题描述: 给定正整数序列x1,...,xn . (1)计算其最长不下降子序列的长度s. (2)计算从给定的序列中最多可取出多少个长度为s的不下降子序列. (3)如果允许在取出的序列中多次 ...

  3. 创建Django工程-Day19

    1. 新建一个day19的工程和app01. 2. 新建templates和static的文件夹. 3. 去settings.py中去做配置. 1)注释掉csrf 2)配置模板路径 'DIRS': [ ...

  4. 【转】WinForms 使用Graphics绘制字体阴影

    转自:http://www.cnblogs.com/LonelyShadow/p/3893743.html C#以两种方法实现文字阴影效果,同时还实现了简单的动画效果: 一种是对文本使用去锯齿的边缘处 ...

  5. [BJWC2011]元素 线性基

    题面 题面 题解 一个方案合法,当且仅当选取的01串凑不出0. 因此就是要使得选取的01串全在线性基内,具体原因可以看这道题:[CQOI2013]新Nim游戏 线性基 要使得魔力值最大,只需要按法力值 ...

  6. mac os 启动服务命令 launchctl

    参考苹果开发者网址 https://developer.apple.com/library/mac/documentation/MacOSX/Conceptual/BPSystemStartup/Ch ...

  7. Windows10实用技巧-固定快捷方式到磁贴菜单方式

    快捷方式固定到磁贴 Win10的开始菜单中的磁贴功能比较不错,可以在不清理桌面上其他软件的情况下直接唤醒需要的应用.  但是比较麻烦的是一些应用或快捷方式并不能直接固定到上面. 后来发现所有Windo ...

  8. Covariance 协方差分析

    sklearn实战-乳腺癌细胞数据挖掘 https://study.163.com/course/introduction.htm?courseId=1005269003&utm_campai ...

  9. SDK代码记录

    zynq中SDK相关API的学习.记录常用函数 /*************************************************************************** ...

  10. Codechef Observing the Tree

    Home » Practice(Hard) » Observing the Tree   https://www.codechef.com/problems/QUERY Observing the T ...