力扣刷题笔记五)

初级算法刷题

只出现一次的数字

思路:

对于暴力破解的一些优化

双重循环

算法思想:

  • 如果向后循环有一样的,把他们放在一起
  • 如果向后循环一遍都没有一样的,那么就是找到了
执行用时: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   }
View Code

 看了一下官方答案,使用异或解题,效率飞起

但是异或都快忘的差不多了,主要知道下面的运算律

  • 一个数和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   }
View Code

拓展学习:

如果有多个单个值呢?如何找出呢?

贴一个大佬的帖子,一起学习!

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];
    }
View Code

这个方法也可以用来查找多个单值的

稍微改造一下,也可以用来解决问题:

寻找一组数中不重复的数,并输出。(并不限制只是重复两次了)

posted @ 2021-12-09 14:16  LonglonglongAL  阅读(48)  评论(0)    收藏  举报