zoukankan      html  css  js  c++  java
  • [LeetCode] 260. Single Number III(位操作)

    传送门

    Description

    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?

    思路

    题意:给定一个数组,其中除了两个数出现一次外,其他都出现两次,要求在时间复杂度为O(n)空间复杂度为O(1)的条件下找出这两个数。

    题解:按照异或的思想,最后可以得到这两个出现一次的数的异或值,那么我们只需对这个异或值lowbit操作,得到其最低位为1的位在哪,然后根据lowbit后得到的值,将数据分为两堆,那么可以知道的是这两个出现一次的数肯定分布在不同的两堆中(因为是对这这两个数的异或值lowbit操作,因此其为1的最低二进制位,这两个数肯定一个数0一个是1),那么问题转化为子问题,有一堆数,出了一个数出现一次外,其他数都出现两次。

    class Solution {
    public:
        //26ms
        vector<int> singleNumber(vector<int>& nums) {
            int diff = 0,one = 0,two = 0;
            vector<int>res;
            for (unsigned int i = 0;i < nums.size();i++){
                diff ^= nums[i];
            }
            diff &= (-diff);  //lowbit操作
            for (unsigned int i = 0;i < nums.size();i++){
                if (nums[i] & diff) one ^= nums[i];
                else    two ^= nums[i];
            }
            res.push_back(one);
            res.push_back(two);
            return res;
        }
    };
    

      

     
  • 相关阅读:
    hdu 1576 A/B(exgcd、乘法逆元+整数快速幂)
    CSS3带小图标垂直下拉菜单
    CSS3动画表单
    灰色3D按钮组合
    半透明菜单导航
    CSS3透明背景表单
    CSS3手风琴菜单 可同时折叠多个菜单
    jQuery图片下滑切换焦点图
    jQuery消息提示框插件Tipso
    jQuery自动轮播图片焦点图
  • 原文地址:https://www.cnblogs.com/ZhaoxiCheung/p/7397374.html
Copyright © 2011-2022 走看看