[LeetCode]single-number

Posted whl-shtudy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[LeetCode]single-number相关的知识,希望对你有一定的参考价值。

题目:Given an 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?

题目理解:一个数组中有一个数是单独的,其他的数都是成对出现的。

简单做法:

  首先,对数组进行排序,然后遍历数组,成对比较数组元素,找出首个不相等的数组元素,返回该元素,则该元素就是数组中唯一的单个元素。由于排序使用的是快排,故满足需求。

代码:

 1 import java.util.Arrays;
 2 public class Solution {
 3     public int singleNumber(int[] A) {
 4         if(A.length == 1) return A[0];
 5         Arrays.sort(A);
 6         for(int i = 1;i < A.length;){
 7             if(A[i-1] != A[i]){
 8                 return A[i-1];
 9             }
10             i += 2;
11         }
12         return 0;
13     }
14 }

进阶版做法(使用位运算):

  异或运算中二个参与运算的对象(二进制)相应位相同,值为0,否则为1.即1^1=0,1^0=1,0^0=0,0^1=1。由这个特性,得到从零开始异或数组元素中每个值,最终剩下的就是数组中单独的那个数,成对的数都异或为0了。

例如:数组为 1 2 1 4 4

0^1 = 0000 0001 = 1

1^2 = 0000 0011 = 3

3^1 = 0000 0010 = 2

2^4 = 0000 0110 = 6

6^4 = 0000 0010 = 2

最后得到数组中唯一的数2.

代码:

1 public class Solution {
2     public int singleNumber(int[] A) {
3         int ret = 0;
4         for(int i=0;i<A.length;i++){
5             ret^=A[i];
6         }
7         return ret;
8     }
9 }

参考资料:

位运算总结:https://blog.csdn.net/sinat_35121480/article/details/53510793

 

以上是关于[LeetCode]single-number的主要内容,如果未能解决你的问题,请参考以下文章

java 来自https://leetcode.com/problems/single-number/#/description

java 来自https://leetcode.com/problems/single-number/#/description

LeetCode——single-number&single-number-ii

LeetCode OJ 136Single Number

leetcode 136 Single Number bBt Option

2017-3-7-lint82single-number