方法一:用哈希集合检测循环
- 创建一个哈希表(map)用于存储每次计算平方和的结果,以及记录是否出现循环。
- 定义一个循环,在循环中进行以下操作: 判断当前的数是否为1或者是否已经在哈希表中出现过,若是则直接返回对应的结果。
将当前的数存储在哈希表中,标记为已经出现过。 - 根据题目要求,计算当前数每个位置上的数字的平方和,得到下一个数。
- 将下一个数作为当前数,继续进行判断和计算。
- 若循环结束后,当前数等于1,则返回true,表示这个数是快乐数;若当前数已经在哈希表中出现过,则返回false,表示这个数不是快乐数。
func isHappy(n int) bool {
seen:=make(map[int]bool)
for n!=1&&!seen[n]{
seen[n]=true
n=calculateSum(n)
}
return n==1
}
func calculateSum(n int) int{
sum:=0
for n>0{
d:=n%10
sum+=d*d
n/=10
}
return sum
}
方法二:快慢指针方法
-
我们使用快慢指针,快指针每次计算两次平方和,慢指针每次计算一次平方和。
-
在每一轮计算后,慢指针在平方和上前进一步,快指针在平方和上前进两步。
-
如果这个数是一个快乐数,那么这两个指针会相遇在1上;如果不是一个快乐数,那么它们最终会进入一个循环,这时候快的指针会追上慢的指针。
func isHappy1(n int) bool {
slow, fast := n, n
for {
slow = calculateSum(slow) // 慢指针每次计算一次
fast = calculateSum(calculateSum(fast)) // 快指针每次计算两次
if slow == 1 {
return true
}
if slow == fast { // 如果快慢指针相遇,说明不是快乐数
return false
}
}
}
// 计算每个位置上的数字的平方和
func calculateSum1(n int) int {
sum := 0
for n > 0 {
digit := n % 10
sum += digit * digit
n /= 10
}
return sum
}