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
- 52.Single Number III
- Single Number III
- Single Number III
- [LeetCode] Single Number III
- [leetcode] Single Number III
- 260 Single Number III
- [Leetcode]Single Number III
- [leetcode] Single Number III
- Leetcode: Single Number III
- 260 Single Number III
- LeetCode || Single Number III
- Single Number III
- Single Number III
- Single Number III
- [刷题]Single Number III
- Single Number III
- Leetcode75: Single Number III
- leetCode---Single Number III
- 横向UITableView的实现和FPPopover的介绍
- Spring注入方式
- QUESTION 66 To recover from the loss of the entire database, including all current control files, al
- 简单实用的json+struts2+ajax异步校验
- jquey 中.live 和.bind区别
- 52.Single Number III
- Redis 集群的合纵与连横
- Java语言注意事项
- @Autowired 注释遇到的问题,@Qualifier 帮助解决问题
- java走迷宫
- SimpleAdapter中使用Drawable和Bitmap对象的方法
- iOS UIView动画详解(Objective-C)
- Android 手把手教你分割String字符串,1个,2个,n个
- onTouchEvent 深入理解