前言
这是五月集训的第十日,今日的训练内容是 位运算
解题报告
1.力扣191
原题链接
https://leetcode.cn/problems/number-of-1-bits/
题目概述
编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量)。
解题思路
使用一个循环不断用 1 位与上数字的最后一位,如果是 1 就累积到计数器上,然后不断的使得这个数右移直到其值为 0 即可。
源码剖析
int hammingWeight(uint32_t n) {
int ans = 0;
while(n){
ans+=(n&1);
n=n>>1;
}
return ans;
}
2.力扣461
原题链接
https://leetcode.cn/problems/hamming-distance/
题目概述
两个整数之间的 汉明距离 指的是这两个数字对应二进制位不同的位置的数目。
给你两个整数 x 和 y,计算并返回它们之间的汉明距离。
解题思路
首先异或两个数,不同位置就会是 1 然后同上去统计 1 的数量就可以了。
源码剖析
int hammingDistance(int x, int y){
int n = x^y;
int ans = 0;
while(n){
ans+=(n&1);
n>>=1;
}
return ans;
}
3.力扣136
原题链接
https://leetcode.cn/problems/single-number/
题目概述
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
解题思路
直接将所有的数字全都异或一下就得到了只出现过一次的那个数。
源码剖析
int singleNumber(int* nums, int numsSize){
int ans = 0;
for(int i=0;i<numsSize;++i){
ans^=nums[i];
}
return ans;
}
4.力扣137
原题链接
https://leetcode.cn/problems/single-number-ii/
题目概述
给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。
解题思路
暂做记录。