题目链接:力扣
题目描述:
只出现一次的数字
难度简单2130
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1] 输出: 1示例 2:
输入: [4,1,2,1,2] 输出: 4通过次数544,988提交次数757,853
二,代码与思想:
package zyh.example.demo.suanfati.leetcode.simple;
import java.util.HashSet;
import java.util.Set;
/**
* @ClassName SingleNumber
* @Author zhangyonghui
* @Description 只出现一次的数字
* @Date 2021/12/1 11:15
* @Version 1.0
**/
public class SingleNumber {
public static void main(String[] args) {
// [4,3,1,2,1,2,3]
// int[] nums = new int[]{4, 3, 1, 2, 1, 2, 3, 5, 6, 7, 8, 6, 7, 5, 4, 9, 9};
int[] nums = new int[]{4,3,1,2,1,2,3};
int number = singleNumber2(nums);
System.out.println("number = " + number);
}
/**
* 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
* 之前的元素和现在这个元素进行比较,如果不一样则继续比较,如果一样则将这两个元素挪到前边,以后不再比较,然后开始下一个元素;
* @param nums
* @return
*/
public static int singleNumber(int[] nums) {
int numsLength = nums.length;
int cishu = 0;
for (int i = 1; i < numsLength; i++) {
int nowNum = nums[i];
// [4,3,1,2,1,2,3]
for (int j = cishu; j < i; j++) {
int preNum = nums[j];
if (preNum == nowNum) {
int temp1 = preNum;
nums[j] = nums[cishu];
nums[cishu] = temp1;
int temp2 = nowNum;
nums[i] = nums[cishu + 1];
nums[cishu + 1] = temp2;
cishu += 2;
break;
}
}
}
return nums[numsLength - 1];
}
/**
* 使用额外内存空间,HashSet来实现:
* Set集合特点:无序,不可重复;
* 底层原理,HashSet是使用hash表实现的,是将HashMap的value作为一个常量值,然后使用HashMap的key来存储数据;
* @param nums
* @return
*/
public static int singleNumber2(int[] nums) {
Set<Integer> hashSet = new HashSet<>();
for (int num : nums) {
//如果可以添加,说明还没有重复元素,继续往后遍历数组元素;
//如果添加失败,则说明有了重复元素,那么将该元素从Set集合中删除,同时继续往后遍历数组元素;
if (hashSet.add(num)) {
continue;
}else{
hashSet.remove(num);
}
}
//最后遍历完成之后,集合中仅剩下一个元素,即返回结果
return hashSet.iterator().next();
}
}