哪些是I類II類工具,LeetCode Single Number I / II / III

 2023-11-18 阅读 31 评论 0

摘要:【1】LeetCode 136 Single Number 題意:奇數個數,其中除了一個數只出現一次外,其他數都是成對出現,比如1,2,2,3,3...,求出該單個數。 解法:容易想到異或的性質,兩個相同的數異或為0,那么把這串數從頭到尾異或起來&#

【1】LeetCode 136 Single Number

題意:奇數個數,其中除了一個數只出現一次外,其他數都是成對出現,比如1,2,2,3,3...,求出該單個數。

解法:容易想到異或的性質,兩個相同的數異或為0,那么把這串數從頭到尾異或起來,最后的數就是要求的那個數。

哪些是I類II類工具?代碼如下:

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。

LeetCode、代碼如下:

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)即可。

leetcode1120。代碼如下:

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};}
};

轉載于:https://www.cnblogs.com/whatbeg/p/5269453.html

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/1/174772.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息