Java--算法--复杂度&对数器&二分法&异或

  1. 时间复杂度:
    1.  

  2. 排序算法:

    1.  

  3. 算法评估指标:

    1.  

    2.  

  4. 对数器:

  5. 二分法:

    1.  

  6. 异或运算:

    1.  

       

       

    2.  

       

       

    3.  

       

      1. N&(~(N)+1) :取出N的最右侧的1  
      1. package com.model.question;
        
        /**
         * @Description:测试类
         * @Author: 张紫韩
         * @Crete 2021/8/14 13:37
         * 异或操作
         * 一个数组,已知:某两个数出现次数事奇数次,其他的都是偶数次,求出这两个数
         */
        public class QuestionDemo02 {
            public static void main(String[] args) {
                int[] arr = {1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4}; //2和4出现次数是奇数次
                XOR(arr);
        
            }
        
            public static void XOR(int[] arr) {
        
                int res = 0;
                for (int val : arr) {
                    res ^= val;
                }
        
        //        找出res最右侧的1, 说明我们要找的两个数在这一位上是不相等的
        //        最右侧的1等于 n & (~n+1)
        //        &:与
        //        ~:取反
        //        10010
        //        1.取反:01101
        //        2.取反加一: 01110
        //        3.10010 & 01110 = 00010 的到最右侧的1
        //
                int rightOne = res & (~res + 1);
        
        //        找到数组所有 rightOne 这一位上位1 的数进行异或操纵
        //        n & 00010=1 :说明 n的第二位上位1
                int res1 = 0;
                for (int val : arr) {
                    if ((val & rightOne) == rightOne) {
                        res1 ^= val;
                    }
                }
        
                System.out.print("出现奇数次的:" + res1+"\t");
                System.out.println(res^res1);
        
        
            }
        
        
        }
    4.   

posted @ 2021-08-17 09:56  张紫韩  阅读(59)  评论(0编辑  收藏  举报