算法笔记-快乐数

2024-04-16

随谈: 这题难点在于 判断数是否重复 和如何反复判断

# 题目

编写一个算法来判断一个数 n 是不是快乐数。

「快乐数」 定义为:

  • 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
  • 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
  • 如果这个过程 结果为 1,那么这个数就是快乐数。

如果 n快乐数 就返回 true ;不是,则返回 false

示例 1:

1
2
3
4
5
6
7
输入:n = 19
输出:true
解释:
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1

示例 2:

1
2
输入:n = 2
输出:false

提示:

  • 1 <= n <= 231 - 1

这题我出问题的地方 简单一句话就是 忘记把 n 在循环中再设置成 numSum 了

# 题解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public class Solution {
public bool IsHappy(int n) {
//求和的数进字典
Dictionary<int,int> SumDic = new();
//拆分当前数 先得到当前数字的位数 可以ToString后 根据字符串来拆

while(true)
{
int numDigit = 0;
int numSum = 0;
char[] numChars = n.ToString().ToCharArray();
numDigit = numChars.Length;
for(int i=0;i<numDigit;i++){
numSum += int.Parse(numChars[i].ToString()) * int.Parse(numChars[i].ToString());
}
//加进字典中
if(SumDic.TryAdd(numSum,0)){
//能加进字典 说明不重复 判断一下Sum是否是1
if(numSum==1){
return true;
}
//更新一下n的值啊 不然循环每次都一样?
n = numSum;
}else{
//不能加进字典 重复
if(numSum == 1){ //快乐数
return true;
}
else{
return false;
}
}
}
}
}