前言
Hi,我是柚子,这是一道可爱的算法题,女神节的话,发篇算法记录庆祝下吧~
问题描述
给你一个非空整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。
示例 1:
输入:nums = [2,2,1]
输出:1
示例二:
输入:nums = [4,1,2,1,2]
输出:4
提示:
1 <= nums.length <= 3 * 104
-3 * 104 <= nums[i] <= 3 * 104
除了某个元素只出现一次以外,其余每个元素均出现两次。
解决方案
1.方案一
HashMap
class Solution {
public int singleNumber(int[] nums) {
int length = nums.length;
//key是数组的值,value是下标list
Map<Integer, List<Integer>> numMap = new HashMap<>();
for (int i = 0; i < length; i++) {
if (!numMap.containsKey(nums[i])){
List<Integer> indexList = new ArrayList<>();
indexList.add(i);
numMap.put(nums[i], indexList);
} else {
List<Integer> indexList = numMap.get(nums[i]);
indexList.add(i);
numMap.put(nums[i], indexList);
}
}
int singleNumber1 = 0;
for (Map.Entry<Integer, List<Integer>> integerListEntry : numMap.entrySet()) {
if (integerListEntry.getValue().size() == 1) {
singleNumber1 = integerListEntry.getKey();
}
}
return singleNumber1;
}
}
2.方案二
暴力解析:双重for循环
class Solution {
public int singleNumber(int[] nums) {
int length = nums.length;
List<Integer> numList = Arrays.stream(nums).boxed().collect(Collectors.toList());
for (int i = 0; i < length; i++) {
for (int j = i + 1; j < length; j++) {
if (nums[i] == nums[j]) {
nums[i] = 0;
nums[j] = 0;
}
}
}
int s = 0;
for (int j = 0; j < length; j++) {
if (nums[j] != 0) {
s = nums[j];
}
}
return s;
}
}
3.方案三
HashSet存储 和 两倍-数组之和=single数字
class Solution {
public int singleNumber(int[] nums) {
int sum1 = 0;
int sum2 = 0;
HashSet<Integer> numSet = new HashSet();
for (int num1 : nums) {
sum1 += num1;
numSet.add(num1);
}
for (Integer num : numSet) {
sum2 += num;
}
int result = sum2*2 - sum1;
return result;
}
}
4.方案四
位运算:异或运算 ⊕
1.任何数和 0 做异或运算,结果仍然是原来的数,即 a⊕0=a。
2.任何数和其自身做异或运算,结果是0,即 a⊕a=0。
3.异或运算满足交换律和结合律,即 a⊕b⊕a = b⊕a⊕a = b⊕(a⊕a) = b⊕0 =b。
class Solution {
public int singleNumber(int[] nums) {
int single = 0;
for (int num : nums) {
single ^= num;
}
return single;
}
}
题目来源:力扣(LeetCode)
链接:https://leetcode.cn/leetbook/read/top-interview-questions/xm0u83/
╭◜◝ ͡ ◜◝╮
( ˃̶͈◡˂ ̶͈ )感觉有用的话,欢迎点赞评论呀!
╰◟◞ ͜ ◟◞╯