
位运算
cx_cs
这个作者很懒,什么都没留下…
展开
-
187. 重复的DNA序列
无原创 2022-08-20 09:51:41 · 68 阅读 · 0 评论 -
137. 只出现一次的数字 II
无原创 2023-03-07 11:26:55 · 66 阅读 · 0 评论 -
剑指 Offer 65. 不用加减乘除做加法
要求:rt思路:明显位运算,进位用与然后左移。非进位部分异或,非进位完了再加进位。为什么进位要无符号?首先题目说了不会溢出,相与后不会出现01000…否则就溢出了所以正数是对的,然后负数没有定义左移,需要转换,-1是1111…转无符号左移一位后是111…110,符号位不变按位取反加1是-2所以负数是对的class Solution {public: int add(int a, int b) { while(b!=0){ int carry=(unsig原创 2022-03-12 12:12:49 · 57 阅读 · 0 评论 -
剑指 Offer 56 - II. 数组中数字出现的次数 II
要求:一个出现一次其他的三次找到那一个思路:把每一二进位加起来对三取余,剩下的就是优化:数组可以去掉,把num右移而不是把i左移class Solution {public: int singleNumber(vector<int>& nums) { vector<int> v(31); for(int i=0;i<nums.size();++i){ for(int j=0;j<31;++j)原创 2022-03-09 20:30:08 · 90 阅读 · 0 评论 -
剑指 Offer 15. 二进制中1的个数
要求:rt思路:class Solution {public: int hammingWeight(uint32_t n) { int sum=0; while(n){ sum++; n&=n-1; } return sum; }};原创 2022-03-04 10:37:53 · 48 阅读 · 0 评论 -
338. 比特位计数
要求:算1到n比特位1的和,且时间O(n)思路:明显去掉低位1少一个1class Solution {public: vector<int> countBits(int n) { vector<int> dp(n+1); for(int i=1;i<=n;++i){ dp[i]=dp[i&(i-1)]+1; } return dp; }};...原创 2022-01-23 11:02:06 · 200 阅读 · 0 评论 -
318. 最大单词长度乘积
要求:两个最长单词乘积且它们不能有相同字母思路:是否相同字母用位运算相与来判断,要注意的是相同字母会在同一个单词出现所以不能加而是位或,优化空间是相同字母组成的不同单词只留下最长的class Solution {public: int maxProduct(vector<string>& words) { int n=words.size(); vector<int> v(n); for(int i=0;i<原创 2022-01-23 11:01:47 · 72 阅读 · 0 评论 -
371. 两整数之和
要求:不能用加号思路:a^b是不进位的加,进位是(a&b)<<1。合理性:因为补码加法只需要无脑加就行了,进位直接进。力扣编译器不能左移最小负数所以要转无符号class Solution {public: int getSum(int a, int b) { while(b!=0){ uint carry=uint(a&b)<<1; a=a^b; b=carry;原创 2022-01-23 11:01:34 · 209 阅读 · 0 评论 -
476. 数字的补数
要求:5取反为010即2思路:先循环找最高为1在哪,然后用全1去异或即可。此外,可以用不停减去最低位一的方法来得到最高位1class Solution {public: int findComplement(int num) { uint mask=1<<31; while((mask&num)==0) mask>>=1; mask=(mask<<1)-1; re原创 2022-01-23 11:01:18 · 70 阅读 · 0 评论 -
693. 交替位二进制数
要求:判断二进位是否交替思路:n和n右移一位异或剩下全是1,它和它加1的与为0class Solution {public: bool hasAlternatingBits(int n) { long a=n^(n>>1); return (a&(a+1))==0; }};原创 2022-01-23 11:00:42 · 120 阅读 · 0 评论 -
342. 4的幂
要求:判断rt思路:2的幂跟4的幂区别在奇偶位,构造mask=10101010相与即可。另外,二项式定理知,4的幂对3取余必为1,如果是2的幂且不是4的幂,即4的x次乘2,对3取余为2class Solution {public: bool isPowerOfFour(int n) { return n>0&&((n&-n)^n)==0&&(n&0xaaaaaaaa)==0; }};class Solution原创 2022-01-23 11:00:28 · 147 阅读 · 0 评论 -
231. 2 的幂
要求:判断rt思路:首先大于0,用异或,投机取巧是2的31次的约数class Solution {public: bool isPowerOfTwo(int n) { return n>0&&(n^(n&(-n)))==0; }};原创 2022-01-22 18:24:26 · 152 阅读 · 0 评论 -
190. 颠倒二进制位
要求:rt思路:一位位取或者倒着输出class Solution {public: uint32_t reverseBits(uint32_t n) { uint32_t ans=0; for(int i=0;i<32;++i){ uint32_t tmp=n&(1<<i)?1:0; ans+=tmp; if(i<31)ans<<=1;原创 2022-01-22 18:10:35 · 152 阅读 · 0 评论 -
260. 只出现一次的数字 III
要求:有两个数字只出现一次其余两次思路:先全部异或得到两个数字异或,然后取出这个异或结果的最低位一用来相与区分两个数,然后全部异或一遍即可。注意最小负数的最低位1就是它本身10000000class Solution {public: vector<int> singleNumber(vector<int>& nums) { long diff=0; for(int num:nums) diff^=num;原创 2022-01-22 17:38:53 · 49 阅读 · 0 评论 -
268. 丢失的数字
要求:0到n找一个丢失的思路:位运算异或nums和0到n剩下,也可以求sum减去class Solution {public: int missingNumber(vector<int>& nums) { int n=nums.size(); int sum=n*(n+1)/2; for(int num:nums) sum-=num; return sum; }};...原创 2022-01-22 13:06:02 · 174 阅读 · 0 评论 -
136. 只出现一次的数字
要求:rt思路:x异或x=0class Solution {public: int singleNumber(vector<int>& nums) { int ans=nums[0]; for(int i=1;i<nums.size();++i){ ans^=nums[i]; } return ans; }};原创 2022-01-22 12:17:37 · 65 阅读 · 0 评论 -
461. 汉明距离
要求:这两个数字对应二进制位不同的位置的数目思路:class Solution {public: int hammingDistance(int x, int y) { int cnt=0; for(int i=0;i<32;++i){ if(((1<<i)&x)!=((1<<i)&y))cnt++; } return cnt; }};...原创 2022-01-22 11:45:28 · 284 阅读 · 0 评论 -
位运算原理
异或^是同0异1则x^000=x,x^111=~x,x^x=0n&(n-1) 去除 n 的位级表示中最低的那一位1n&(-n) 得到 n 的位级表示中最低的那一位1c++只有>>,无符号右移和有符号右移区别是有符号补符号位要得到 1 到 i 位为 0 的 mask,只需将 1 到 i 位为 1 的 mask 取反,即 ~((1<<i)-1)...原创 2022-01-22 11:20:32 · 485 阅读 · 0 评论