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;
        }
    
    }
    
  • 相关阅读:
    Java抽象类和接口和继承之间关系
    Java程序中解决数据库超时与死锁
    怎样成为一名出色的Java Web程序员?
    Java中断线程的方法
    Java 集合框架(Collection)和数组的排序
    StringBuffer帮你减轻Java的负担
    学好Java开发的关键七步
    kvm的分层控制
    一个高扩展高可用高负载的应用架构的诞生记(原创)
    防火墙规则
  • 原文地址:https://www.cnblogs.com/Courage129/p/14145693.html
Copyright © 2011-2022 走看看