题目来源于知识星球—英雄算法联盟,五月算法集训专题
目录
前言
跟随英雄算法联盟博主—英雄哪里出来,每天完成相应的算法练习,一个月后,必定会有所成长!
一、191.位1的个数(简单)
1.题目描述
2.解题思路
用“位与”来判断最低位是什么,然后右移。无论是0或1,位与上1,还是他本身;
无论是0或1,位与上0,就变成0.
3.代码演示(C++)
class Solution
{//用位与判断最低位是什么,然后右移;
//无论是0或1,位与上1,还是它本身;
//无论是0或1,位与上0,就变成为0;
public:
int hammingWeight(uint32_t n)
{
int ans=0;
while(n)
{
ans+=n&1;
n=n>>1;//判断之后右移1位
}
return ans;
}
};
4.题目链接
二、461.汉明距离(简单)
1.题目描述
2.解题思路
这道题采用的是异或的思想。两个相同的数异或的结果为0,两个不同的数异或的
结果为1.因此只需要将两个数进行异或,异或结果中1的个数即为汉明距离。
3.代码演示(C++)
class Solution
{//对于两个数来说,如果相同位置的二进制位相同,则对应汉明距离为0,否则为1;
//将两个数异或之后,求异或结果的位1的个数
public:
int hammingDistance(int x, int y)
{
return hammingWeight(x^y);
}
int hammingWeight(uint32_t n)
{
int ans=0;
while(n)
{
ans+=n&1;
n=n>>1;
}
return ans;
}
};
4.题目链接
三、136.只出现一次的数字(简单)
1.题目描述
2.解题思路
由题意可知,只有一个元素出现过一次,其他元素都出现了两次,因此采用“异或”
的思想。两个相同的数异或结果为0,那么将数组中所有的元素都进行异或运算,
最终的结果即为只出现过一次的数字。
3.代码演示(C++)
class Solution
{//相同的两个数异或结果为0,因此最后结果为只出现过一次的数;
public:
int singleNumber(vector<int>& nums)
{
int n=nums.size();
int ans=0;
for(int i=0;i<n;i++)
{
ans=ans^nums[i];
}
return ans;
}
};
4.题目链接
四、137.只出现一次的数字 II(中等)
1.题目描述
2.解题思路
在数组中,除了某个元素出现过一次外,其他元素都出现过3次。将每个数转换
成二进制之后进行排列,对每个位分别进行计算,如果加起来是3的倍数,说明
只出现一次的数的对应为是0,否则为1。
3.代码演示(C++)
class Solution
{
//将每个数转换成二进制之后排列
//对每个位分别进行计算,如果加起来是3的倍数,说明只出现一次的数的对应位是0,否则为1
public:
int singleNumber(vector<int>& nums)
{
int n=nums.size();
int ret=0;
for(int i=0;i<32;i++)
{
int ans=0;
for(int j=0;j<n;j++)
{
ans+=(nums[j]>>i)&1;
}
ans%=3;
if(ans)
{
ret+=((unsigned int)1<<i);
}
}
return ret;
}
};
4.题目链接
总结
每天跟随英雄哥学习相关的算法,一个月会收获很多,如果你想了解更多关于知识星球的内容,欢迎联系我!