力扣刷题笔记五)
初级算法刷题
只出现一次的数字
思路:
对于暴力破解的一些优化
双重循环
算法思想:
- 如果向后循环有一样的,把他们放在一起
- 如果向后循环一遍都没有一样的,那么就是找到了
执行用时:137 ms
内存消耗:38.5 MB
1 public static int singleNumber(int[] nums){
2 int j,i,temp;
3 for(i=0;i<nums.length-1;i++){
4 Boolean flag=false;
5 for(j=i+1;j<nums.length;j++){
6 if(nums[i]==nums[j]){
7 temp=nums[i+1];
8 nums[i+1]=nums[j];
9 nums[j]=temp;
10 i++;
11 flag=true;
12 break;
13 }
14 }
15 if(((j==(nums.length))&&!flag)||((i==(nums.length))&&!flag)){
16 break;
17 }
18 }
19 return nums[i];
20 }
看了一下官方答案,使用异或解题,效率飞起
但是异或都快忘的差不多了,主要知道下面的运算律
- 一个数和0进行异或运算 = 这个数本身 a^0 = a
- 相同的数进行异或运算 = 0 a^a = 0
- 满足交换律和结合律 a^b^a = (a^a)^b = 0^b = b
1 public static int singleNumber(int[] nums){
2 int single=0;
3 for(int i:nums){
4 single=single^i;
5 }
6 return reduce;
7 }
拓展学习:
如果有多个单个值呢?如何找出呢?
贴一个大佬的帖子,一起学习!
https://blog.csdn.net/qq_19272431/article/details/78564391
除此之外,还可以用SET集合,也就是哈希表
set集合的特点是:
存储无序
集合唯一
public static int singleNumber(int[] nums) { Set<Integer> single=new HashSet<>(); for(int i:nums){ if(!single.add(i)){ single.remove(i);//插入失败说明是重复的值 } } return (int)single.toArray()[0]; }
这个方法也可以用来查找多个单值的
稍微改造一下,也可以用来解决问题:
寻找一组数中不重复的数,并输出。(并不限制只是重复两次了)

浙公网安备 33010602011771号