统计一个数字在排序数组中出现的次数

来源:互联网 发布:淘宝代购手机 编辑:程序博客网 时间:2024/06/06 13:11
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
 * 1、把数组从头到尾做异或操作,出现两次的数字会相互抵消,因为自己和自己异或就是0,剩下的就是出现1次的数字的异或

 * 2、把最后得到的异或值第一个为1的位的位置 

 * 3、根据这个位置为1将原数组分成n等分

 * 4、分别对这n个数组求异或,因为两个相同的数任何一位都是相同的,一定会被分到同一组,异或会相互抵消,最后得出来的就是出现次数为1的数字

import java.util.Scanner;/** * 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。 * 1、把数组从头到尾做异或操作,出现两次的数字会相互抵消,因为自己和自己异或就是0,剩下的就是出现1次的数字的异或 * 2、把最后得到的异或值第一个为1的位的位置 3、根据这个位置为1将原数组分成n等分 * 4、分别对这n个数组求异或,因为两个相同的数任何一位都是相同的,一定会被分到同一组,异或会相互抵消,最后得出来的就是出现次数为1的数字 *  * @author pomay * */public class FindNumsAppearOnce{public static void NumsXOR(int[] array, int num1[], int num2[]){if (array == null || array.length < 2)return;int result = 0;for (int i = 0; i < array.length; i++)// 把数组从头到尾做异或操作result ^= array[i];int index = findBitsOf1(result);for (int i = 0; i < array.length; i++){if (IsBits(array[i], index))num1[0] ^= array[i];elsenum2[0] ^= array[i];}}static int findBitsOf1(int result)// 找到result中第一个1的位的位置{int index = 0;while ((result & 1) == 0){result = result >> 1;++index;}return index;}// 判断数组中某个数,的第index位是不是1static boolean IsBits(int num, int index){num = num >> index;if ((num & 1) == 1)return true;elsereturn false;}public static void main(String[] args){Scanner sc = new Scanner(System.in);while (sc.hasNext()){int n = sc.nextInt();int[] a = new int[n];for (int i = 0; i < a.length; i++)a[i] = sc.nextInt();// num1,num2分别为长度为1的数组,传出参数, 将num1[0],num2[0]设置为返int[] num1 = new int[1];int[] num2 = new int[1];num1[0] = num2[0] = 0;NumsXOR(a, num1, num2);System.out.print(num1[0] + " " + num2[0] + " ");}}}




原创粉丝点击