「这是我参与2022首次更文挑战的第14天,活动详情查看:2022首次更文挑战」。
前言
大家好,我是程序猿小白 GW_gw,很高兴能和大家一起学习进步。
以下内容部分来自于网络,如有侵权,请联系我删除,本文仅用于学习交流,不用作任何商业用途。
摘要
本文主要介绍LeetCode只出现一次的数字的一些解法和思路。
【题目】
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
输入: [2,2,1]
输出: 1
题目链接:leetcode-cn.com/leetbook/re…
这道题比较简单,之所以拿出来是为了让大家了解以下第二种和第三种解法思路,通过位运算和集合特性来解题,希望读者能够举一反三。
【解法一】
【思想】
先排序,使用count记录该元素出现的次数。
count初值为1,比较相邻的元素:
如果相等就count++,并且跳过下一个元素。
如果不相等就判断count是否<2,如果小于2,则返回该元素。
【代码】
public static int singleNumber(int[] nums) {
/*
解法1:先对数组进行排序,利用count记录每个数出现的次数。
*/
//先判断如果只有一个元素,则直接返回该元素
if(nums.length==1){
return nums[0];
}
Arrays.sort(nums);
int len = nums.length;
int i=0;
for (; i < len-1; i++) {
int count = 1;
if(nums[i]==nums[i+1]){
count++;
i++;
}
if(count<2){
break;
}
}
if(i>=len){
return -1;
}
return nums[i];
}
【解法二】
【思想】
位运算
异或运算规律:a^b^a = a^a^b = b
将所有元素进行异或运算,最后得到的值就是要返回的值。
【代码】
public static int singleNumber2(int[] nums){
/*
解法2:异或运算
*/
int result = 0;
for (int i = 0; i < nums.length; i++) {
result ^= nums[i];
}
return result;
}
【解法三】
【思想】
使用set集合特性
把每个元素加入set中,如果添加失败,则说明以前添加过,就把该元素从集合中删除,
最后set集合中剩余的那个元素就是需要的元素。
【代码】
public static int singleNumber3(int[] nums){
/*
解法3:使用set集合特性
*/
Set<Integer> hashSet = new HashSet();
for (int i = 0; i < nums.length; i++) {
if(!hashSet.add(nums[i])){
hashSet.remove(nums[i]);
}
}
return (int)hashSet.toArray()[0];
}
小结
以上就是此题的三种解法和思想,希望能对读者有所帮助,如有不正之处,欢迎留言指正。