136.Single Number
Posted 二十年后20
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了136.Single Number相关的知识,希望对你有一定的参考价值。
题目链接:https://leetcode.com/problems/single-number/description/
题目大意:给出一串数组,里面的数都是两个,只有一个数是一个,把这个只有一个的数找出来。时间复杂度最好是线性的,空间复杂度最好为O(1).
法一:利用map,空间换时间,代码如下(耗时26ms):
1 public int singleNumber(int[] nums) { 2 Map<Integer, Integer> map = new HashMap<Integer, Integer>(); 3 int res = -1; 4 for(int i = 0; i < nums.length; i++) { 5 if(map.get(nums[i]) != null && map.get(nums[i]) == 1) { 6 map.put(nums[i], 2); 7 } 8 else { 9 map.put(nums[i], 1); 10 } 11 } 12 for(int i = 0; i < nums.length; i++) { 13 if(map.get(nums[i]) == 1) { 14 res = nums[i]; 15 break; 16 } 17 } 18 return res; 19 }
法二:先排序,再一个for循环,依次比较,代码如下(耗时8ms):
1 public int singleNumber(int[] nums) { 2 Arrays.sort(nums); 3 int res = nums[0]; 4 int cnt = 1; 5 boolean flag = false; 6 for(int i = 1; i < nums.length; i++) { 7 if(nums[i] != nums[i - 1]) { 8 if(cnt == 1) { 9 res = nums[i - 1]; 10 flag = true; 11 break; 12 } 13 cnt = 1; 14 } 15 else { 16 cnt++; 17 } 18 } 19 if(flag == false) { 20 res = nums[nums.length - 1]; 21 } 22 return res; 23 }
法三(借鉴):利用异或,由3^3=0知道,相同的两个数异或为0,不同的两个数异或为1,代码如下(耗时1ms):
1 public int singleNumber(int[] nums) { 2 int res = nums[0]; 3 for(int i = 1; i < nums.length; i++) { 4 res = res ^ nums[i]; 5 } 6 return res; 7 }
以上是关于136.Single Number的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode136 Single Number, LeetCode137 Single Number II, LeetCode260 Single Number III