Leetcode202. 快乐数
题目:
编写一个算法来判断一个数是不是“快乐数”。
一个“快乐数”定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是无限循环但始终变不到 1。如果可以变为 1,那么这个数就是快乐数。
示例:
输入: 19
输出: true
解释:
12+92=821^2 + 9^2 = 8212+92=82
82+22=688^2 + 2^2 = 6882+22=68
62+82=1006^2 + 8^2 = 10062+82=100
12+02+02=11^2 + 0^2 + 0^2 = 112+02+02=1
题解:
本题和141题环形链表类似。
方案一:hash表
若一个数是快乐数,最终变换会回到1,因此确定循环终结条件;
若不是快乐数,会进入死循环,如何终至死循环,将每次变换过后的值存入HashSet中,判断是否出现过重复值,出现则return false;
方案二:快慢指针
“快指针”每次走两步,“慢指针”每次走一步,当二者相等时,即为一个循环周期。此时,判断是不是因为1引起的循环,是的话就是快乐数,否则不是快乐数。
scala代码如下:
def isHappy2(n: Int): Boolean = {
var n1 = n
var result = true
var flag =true
val set = new java.util.HashSet[Int]()
set.add(n1)
while (n1 != 1 && flag) {
n1 = bitSquareSum(n1)
if (set.contains(n1)) {
result = false
flag =false
}
else set.add(n1)
}
result
}
def bitSquareSum(n: Int): Int = {
var n1 = n
var sum = 0
while (n1 > 0) {
val bit = n1 % 10
sum += bit * bit
n1 = n1 / 10
}
sum
}
快慢指针方法:
def isHappy(n: Int): Boolean = {
var slow = n
var fast = n
do {
slow = bitSquareSum(slow)
fast = bitSquareSum(fast)
fast = bitSquareSum(fast)
} while (slow != fast)
slow == 1
}
def bitSquareSum(n: Int): Int = {
var n1 = n
var sum = 0
while (n1 > 0) {
val bit = n1 % 10
sum += bit * bit
n1 = n1 / 10
}
sum
}