[leetcode]136.Single Number
Posted shinjia
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[leetcode]136.Single Number相关的知识,希望对你有一定的参考价值。
题目
Given a non-empty array of integers, every element appears twice except for one. Find that single one.
Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
Example 1:
Input: [2,2,1]
Output: 1
Example 2:
Input: [4,1,2,1,2]
Output: 4
解法一
思路
暴力解法,直接两个for循环,用一个count数组来保存nums数组每个元素出现的次数,最后遍历一遍count数组,找出值为1的那个下标res,然后返回nums[i]即可。时间复杂度为O(n2)。
代码
class Solution {
public int singleNumber(int[] nums) {
int[] count = new int[nums.length];
int res = -1;
for(int i = 0; i < nums.length; i++)
for(int j = 0; j < nums.length; j++) {
if(nums[i] == nums[j])
count[i]++;
}
for(int i = 0; i < count.length; i++)
if(count[i] == 1) res = i;
return nums[res];
}
}
解法二
思路
先将nums数组排序,先后再遍历一次数组即可,时间复杂度取决于所用的排序算法。
代码
class Solution {
public int singleNumber(int[] nums) {
Arrays.sort(nums);
int res = -1;
for(int i = 0; i < nums.length; i+=2) {
if(i == nums.length-1 || nums[i] != nums[i+1]) {
res = nums[i];
break;
}
}
return res;
}
}
解法三
思路
这种解法真!的!太!精!彩!了!啊!运用了XOR(异或)运算符 ^= 。
异或是一种基于二进制的位运算,用符号XOR或者 ^ 表示,其运算法则是对运算符两侧数的每一个二进制位,同值取0,异值取1。
简单理解就是不进位加法,如1+1=0,,0+0=0,1+0=1。
性质
1、交换律
2、结合律(即(a^b)^c == a^(b^c))
3、对于任何数x,都有x^x=0,x^0=x
4、自反性 A XOR B XOR B = A xor 0 = A
也就是说对于任何一个数N,N^N=0,0^N=N,所有这道题,我们只要对所有元素求异或即可,res初始化为0是因为0^N=N,不会影响结果。
代码
class Solution {
public int singleNumber(int[] nums) {
int res = 0;
for(int i = 0; i < nums.length; i++) {
res ^= nums[i];
}
return res;
}
}
以上是关于[leetcode]136.Single Number的主要内容,如果未能解决你的问题,请参考以下文章