zoukankan      html  css  js  c++  java
  • LeetCode Single Number I / II / III

    【1】LeetCode 136 Single Number

    题意:奇数个数,其中除了一个数只出现一次外,其他数都是成对出现,比如1,2,2,3,3...,求出该单个数。

    解法:容易想到异或的性质,两个相同的数异或为0,那么把这串数从头到尾异或起来,最后的数就是要求的那个数。

    代码如下:

    class Solution {
    public:
        int singleNumber(vector<int>& nums) {
            int sum = 0;
            for(int i=0;i<nums.size();i++) 
                sum ^= nums[i];
            return sum;
        }
    };

    【2】LeetCode 137 Single Number II

    题意:给一串数,除了一个数只出现一次外,其他数都出现了三次。求那个单个数。

    解法:还是从位操作上考虑,把每个数写成二进制列出来,每位对齐,可以发现,每一位上的1的个数要么是3的倍数,要么是3的倍数+1,那么把每一位的1个数加起来,模3即可的单个数的该位为0还是为1。

    代码如下:

    class Solution {
    public:
        int singleNumber(vector<int>& nums) {
            int ans = 0;
            for(int i=0;i<32;i++) {
                int dream = (1<<i), cnt = 0;
                for(int j=0;j<nums.size();j++)
                    cnt += (bool)(nums[j] & dream);
                cnt = cnt % 3;
                ans ^= (cnt << i);
            }
            return ans;
        }
    };

    【3】LeetCode 260 Single Number III

    题意:有一串数字,其中有两个不同的数,各出现一次,其他的数都出现2次。找出这两个数。

    解法:看到其他数出现两次,又想到异或操作,如果全部异或起来,得到的是那两个数的异或。既然是两个不同的数,那么异或的二进制里面必然是有1的,我们先找出这个1,然后逐个检查,如果这位有1,那么异或到a,否则异或到b,最后的a,b即是这两个值。找1可以找最后一个1,x&(-x)即可。

    代码如下:

    class Solution {
    public:
        vector<int> singleNumber(vector<int>& nums) {
            int xorsum = 0;
            for(int i=0;i<nums.size();i++) xorsum ^= nums[i];
            int lastdifferentbit = xorsum & (-xorsum);
            int a = 0, b = 0;
            for(int i=0;i<nums.size();i++) {
                if(nums[i] & lastdifferentbit) a ^= nums[i];
                else b ^= nums[i];
            }
            return vector<int>{a,b};
        }
    };
  • 相关阅读:
    cms建站
    tab切换 原生js
    iOS下JS与原生OC互相调用(总结)
    HBuilder设置沉浸式状态栏显示效果
    JQuery 绑定select标签的onchange事件,弹出选择的值,并实现跳转、传参
    js调用app启动页
    CSS实现单行、多行文本溢出显示省略号(…)
    Java NIO系列教程(七) FileChannel
    Java NIO系列教程(六) Selector
    Java NIO系列教程(五) 通道之间的数据传输
  • 原文地址:https://www.cnblogs.com/whatbeg/p/5269453.html
Copyright © 2011-2022 走看看