码迷,mamicode.com
首页 > 其他好文 > 详细

Single Number III

时间:2016-08-07 16:47:25      阅读:125      评论:0      收藏:0      [点我收藏+]

标签:

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].

Note:

  1. The order of the result is not important. So in the above example, [5, 3] is also correct.
  2. Your algorithm should run in linear runtime complexity. Could you implement it using only constant space complexity?

解调思路:考察位运算。题目描述说数组中除了有两个数只出现了1次之外其余的书都出现了两次。因此可以相等使用异或的方法。但是将数组所有的元素都进行异或得到的结果是两个只出现1次的数异或后的结果,如何能得到那两个只出现了1次的数呢?通过观察我们可以发现异或的结果的二进制表示有0有1,这表明这两个数是有差异的。我们可以从异或结果的二进制表示中找到从低位往高位数第一个为1的位置,根据异或的性质可知这个位置正好可以区分这两个数。因此我们可以根据这一位是否为1,将数组分为两部分。这样问题就变成了求single number 的问题了。

 1 public class Solution {
 2     public int[] singleNumber(int[] nums) {
 3         int xorResult = 0;
 4         int[] result = new int[2];
 5         for (int i = 0; i < nums.length; i++) {
 6             xorResult ^= nums[i];
 7         }
 8         int ident = xorResult & -xorResult;
 9         for (int i = 0; i < nums.length; i++) {
10             if ((nums[i] & ident) != 0) {
11                 result[0] ^= nums[i];
12             }
13         }
14         result[1] = result[0] ^ xorResult;
15         return result;
16     }
17 }

 

Single Number III

标签:

原文地址:http://www.cnblogs.com/FLAGyuri/p/5746314.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!