zoukankan      html  css  js  c++  java
  • Leetcode 260. Single Number III

    260. Single Number III

    • Total Accepted: 42076
    • Total Submissions: 91382
    • Difficulty: Medium

    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?

    思路:

    a^a=0。

    nums中只有2个数是唯一,设为a,b,那么对nums所有元素异或操作以后得到的是a^b。a和b在某些位上是不相等的,所以c=a^b!=0(c是二进制数)。所以先找到a和b不相等的某一位(可以是由右向左第一个为1的位),也就是c[i]==1;再根据c[i]将nums中的元素分为2类:对c[i]贡献了1和对c[i]贡献了0,a和b被分到不同类中,再在各自类中异或操作得到a和b。

    这里注意操作符优先级:非和取反操作>加减乘除操作>==操作>与或、异或、同或操作

    代码:

     1 class Solution {
     2 public:
     3     vector<int> singleNumber(vector<int>& nums) {
     4         int Xor=0;
     5         for(int i=0;i<nums.size();i++) Xor^=nums[i];
     6         Xor&=-Xor;//取由右向左第一个为1的位
     7         vector<int> res(2,0);
     8         for(int i=0;i<nums.size();i++){
     9             //下面的if-else也可以写成res[!(Xor&diff)]^=nums[i];
    10             if((Xor&nums[i])==0){
    11                 res[0]^=nums[i];
    12             }
    13             else{
    14                 res[1]^=nums[i];
    15             }
    16         }
    17         return res;
    18     }
    19 };
  • 相关阅读:
    ASP.NET之电子商务系统开发1(数据列表)
    ASP.NET之电子商务系统开发2(购物车功能)
    MFC之列表控件
    自己动手写操作系统(二)一个最小的“操作系统”
    自己动手写操作系统(一)环境准备
    windows常用快捷键
    MFC之下拉框
    链表反转&交换链表结点
    TinyHttp前置知识
    单链表基本操作总结
  • 原文地址:https://www.cnblogs.com/Deribs4/p/5724588.html
Copyright © 2011-2022 走看看