zoukankan      html  css  js  c++  java
  • 找出数组中出现了奇数次的两个数

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

    题目描述

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

    题目思路:

    思路:对数组所有的数进行异或运算,偶数个数的数异或结果为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;
        }
    
    }
    
  • 相关阅读:
    1.Lucene
    docker 安装常用服务
    docker 常用命令
    05-vue中使用样式
    04-vue的事件修饰符
    03-用基本指令实现跑马灯效果
    02-vue基本指令
    01-vue分层概念MVVM
    Redis-持久化机制
    BigDecimal工具类
  • 原文地址:https://www.cnblogs.com/Courage129/p/14145693.html
Copyright © 2011-2022 走看看