「这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战」
202. 快乐数
题目描述
编写一个算法来判断一个数 n
是不是快乐数。
「快乐数」定义为:
- 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
- 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
- 如果 可以变为 1,那么这个数就是快乐数。
如果 n
是快乐数就返回 true
;不是,则返回 false
。
示例 1:
输入: 19
输出: true
解释: 12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1
示例 2:
输入: n = 2
输出: false
暴力法(错误解法,虽然能过leetcode)
判断条件有误,考虑不周全
class Solution
{
public:
bool isHappy(int num)
{
// 得到每次累加的和
int sum = getSum(num);
// 怕毛短是否
while (sum != 1)
{
// 如果各位累加小于10,(漏洞:当sum=7时 ,结果为 1 符合要求)
if (sum < 10)
{
return false;
}
sum = getSum(sum);
}
return true;
}
// 求和方法一
// 定义函数求出数字各位累加的和
int getSum(int num)
{
// 先将原始数字转换成字符串
string s = to_string(num);
int sum = 0;
for (int i = 0; i < s.size(); i++)
{
// 数字从48开始的,所以强转后需要再减去48,不然数字会越来越大
int n = int(s[i]) - 48;
sum += n * n;
}
return sum;
}
};
算法能在leetcode验证通过,但是存在很大漏洞
哈希法
题目描述中:可能会出现无限循环,则说明
sum
的值可能重复出现,那么就可以将出现过的值使用集合记录,如果重复出现了则可以判定数字的和不能满足要求。
class Solution
{
public:
bool isHappy(int num)
{
int sum = getSum(num);
// 记录出现过的sum值
unordered_set<int> set;
set.insert(sum);
while (1)
{
// 判断sum值是否符合条件
if (sum == 1)
{
return true;
}
sum = getSum(sum);
if (set.find(sum) != set.end())
{
return false;
}
set.insert(sum);
}
}
//求和方法二
int getSum(int num)
{
int sum = 0;
// 遍历num的各位
while (num)
{
// 求各位数值的平方
// 首先从个位开始计算
sum += (num % 10) * (num % 10);
// 数值每次缩小10倍
num /= 10;
}
return sum;
}
};