52.Single Number III

来源:互联网 发布:手机怎么绑定淘宝 编辑:程序博客网 时间:2024/06/15 11:09

Given an array of numbers nums, in which exactly two elements appear only once and all the other elements appear exactly twice. Find the two elements that appear only once.

For example:

Given nums = [1, 2, 1, 3, 2, 5], return [3, 5].

分析:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。

 public int[] singleNumber(int[] nums) { int[] numR = new int[2]; int pos=0; Arrays.sort(nums);//首先对数组进行排序for(int i=0;i<nums.length-1;i=i+2){if(nums[i]!=nums[i+1]){//判断当前数字与其后一个数字是否相等numR[pos++]=nums[i];System.out.println(pos);i=i-1;}}if(pos<2){numR[pos] = nums[nums.length-1];}return numR;    }


方法二:

整个过程分为两个步骤,首先把数组中所有的元素进行异或操作,得到的异或结果肯定不为0,那么找到这个异或结果中第一个为1的位置,假如是第n位。

* 然后按照第n为是否为1将元数组中的元素分为两组。那么出现两次的元素肯定分成两组,出现一次的那两个元素肯定被分到了不同的组里。原因是:之前的异或结果
* 第n为是1,那么出现一次的那两个元素在这第n位上肯定是不同的,所以会被分到不同的组里。对于两个相同的数字进行异或操作,结果肯定是0,那么其第n位肯定是相同的,
* 要么都是1要么都是0.
* 这样问题就转化为求一个数组中那个只出现一次的元素,其他元素都是出现两次。

* 另外通过这个题目学到了0与其他数异或结果还是其他数


/** * 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。 * @param array * num1,num2分别为长度为1的数组。传出参数 * @param num1 将num1[0],num2[0]设置为返回结果 * @param num2 *  * 整个过程分为两个步骤,首先把数组中所有的元素进行异或操作,得到的异或结果肯定不为0,那么找到这个异或结果中第一个为1的位置,假如是第n位。 * 然后按照第n为是否为1将元数组中的元素分为两组。那么出现两次的元素肯定分成两组,出现一次的那两个元素肯定被分到了不同的组里。原因是:之前的异或结果 * 第n为是1,那么出现一次的那两个元素在这第n位上肯定是不同的,所以会被分到不同的组里。对于两个相同的数字进行异或操作,结果肯定是0,那么其第n位肯定是相同的, * 要么都是1要么都是0. * 这样问题就转化为求一个数组中那个只出现一次的元素,其他元素都是出现两次。 *  * 另外通过这个题目学到了0与其他数异或结果还是其他数。 *  */ public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {        int len = array.length;        if(len <= 1){        return;        }        int OrResult = array[0];//表示所有元素异或的结果        for(int i = 1;i<len;i++){        OrResult = array[i] ^ OrResult;        }//        System.out.println("OrResult = "+OrResult);        /*异或结果的二进制表示中首位为1的下标*/        int index1 = FindFirst1(OrResult);        for(int i = 0;i<len;i++){        if(IsBit1(array[i],index1) == true){        num1[0] = num1[0]^array[i];        //System.out.println(array[i]);        }else{        num2[0] = num2[0]^array[i];//        System.out.println(array[i]);        }        }            } /**  * 寻找一个整数的二进制表示中,右边第一个不为1的下标。   */ int FindFirst1(int n){ int index = 0; while(n%2==0){ n = n>>1;        index++; } return index; } /**  * 判断一个整数的二进制表示中从右边数第n位是否为1.  */ boolean IsBit1(int num,int n){ num = num >>n; return (num&1) == 1 ; }


0 0
原创粉丝点击