• 找出数组中出现了奇数次的两个数


    找出数组中出现了奇数次的两个数

    题目描述

    一个数组中有两种数出现了奇数次,其他数都出现了偶数次,怎么找到并打印这两种数

    题目思路:

    思路:对数组所有的数进行异或运算,偶数个数的数异或结果为0,将这两个要找的数标记为A、B,也就是最终结果为A、B异或的结果,此时取出右边第一个1,A、B在此位置的值不相同,一个为1,另一个为0,根据这个特点将这些数据分为两两组,分别异或.

    图示:

    代码:

    package com.courage.algorithm;
    /*
    一个数组中有两种数出现了奇数次,
    其他数都出现了偶数次,怎么找到并打印这两种数
    *
     */
    public class FindTwoNumber {
        public static void main(String[] args) {
           int [] arr = {1,1,2,2,3,3,4,4,5,6,6,7,8,8,9,9};
            findTwoNumber(arr);
    
        }
        /*
         * 思路:对数组所有的数进行异或运算,偶数个数的数异或结果为0,将这两个要找的数标记为A、B
         *      也就是最终结果为A、B异或,此时取出右边第一个1,A、B再此位置的值不相同,一个为1,
         *       另一个为0,根据这个特点将这些数据分为两拨,分别异或.
         *
         * */
        public static void findTwoNumber(int[] arr) {
    
            int temp = 0;
            for (int i = 0; i < arr.length; i++) {
                temp ^= arr[i];
            }
            int markBite = findBit1RightNumber(temp);
            int A = 0;
            int B = 0;
            for (int i = 0; i < arr.length; i++) {
                if ((arr[i] & markBite) == markBite){
                    A ^= arr[i];
                }else{
                    B ^= arr[i];
                }
            }
            System.out.println("奇数个数的两个数分别为:"+A+"、"+B);
        }
        //找出所给数字右边第一个非零位
        public static int findBit1RightNumber(int number) {
            int temp = ~number;
            temp += 1;
            temp = number & temp;
           return temp;
        }
    
    }
    
  • 相关阅读:
    Java学习之路
    ofo开锁共享平台
    Texstudio
    我的母亲 (老舍)
    Excel数据透视表
    Excel分类汇总与数据有效性
    Tomcat源码分析
    证明:在任意六人的聚会中,要么有三人曾经认识,要么有三人不曾认识
    琅琊榜读书笔记
    选择排序可视化
  • 原文地址:https://www.cnblogs.com/Courage129/p/14145693.html
Copyright © 2020-2023  润新知