191. 位1的个数
位运算
不是很会
最简单的办法是右移这个数,然后与1,结果为1的让计数器++
也就是
class Solution {
public:
int hammingWeight(uint32_t n) {
int ans=0;
while(n)
{
ans+=n&1;
n>>=1;
}
return ans;
}
};
比较慢
然后这道题的另一个做法是
X = X & ( X -1 ) 这个操作可以清除最低位的⼆进制位 1,利用这个操作,直至把数清零。操作了几次即为有几个二进制位 1
class Solution {
public:
int hammingWeight(uint32_t n) {
int ans=0;
while(n)
{
ans++;
n=n&(n-1);
}
return ans;
}
};
202. 快乐数
只能想到暴力解法,我不快乐(
循环很多次后还没结束,就返回false
看了一下题解,还蛮难的呢
哈希解法
好牛哇,我怎么没想到!
题目中说了会 无限循环,那么也就是说求和的过程中,sum会重复出现,如果重复出现就代表陷入死循环。使用哈希法,来判断这个sum是否重复出现,如果重复了就是return false, 否则一直找到sum为1为止。判断sum是否重复出现就可以使用unordered_set。
class Solution {
public:
int Nsum(int n)
{
int sum=0;
while(n)
{
int temp=n%10;
sum+=temp*temp;
n/=10;
}
return sum;
}
bool isHappy(int n) {
unordered_map<int,int> hash;
int sum;
while(1)
{
n = Nsum(n);
if(n==1)
return true;
if(hash[n]==1)
return false;
else
hash[n]=1;
}
return true;
}
};
但是还有快慢指针的做法
使用 “快慢指针” 思想,找出循环:“快指针” 每次走两步,“慢指针” 每次走一步,当二者相等时,即为一个循环周期。此时,判断是不是因为 1 引起的循环,是的话就是快乐数,否则不是快乐数。
和找循环链表的思想很像
class Solution {
public:
int Nsum(int n)
{
int sum=0;
while(n)
{
int temp=n%10;
sum+=temp*temp;
n/=10;
}
return sum;
}
bool isHappy(int n) {
int slow=n,fast=n;
do{
slow=Nsum(slow);
fast=Nsum(fast);
fast=Nsum(fast);
}while(fast!=slow);
return slow==1;
}
};
真是天才的想法啊,牛的牛的
然后做了一下模拟周赛的简单题
2582. 递枕头
其实就是周期
花了一点时间画图确定具体周期是n2-2还是nn-3
class Solution {
public:
int passThePillow(int n, int time) {
int num=n*2-2;
int temp=time%num;
if(temp<n)
return temp+1;
else
return n-(temp+1)%n;
return n;
}
};
嘿嘿