Write an algorithm to determine if a number is "happy".
A happy number is a number defined by the following process: Starting with any positive integer, replace the number by the sum of the squares of its digits, and repeat the process until the number equals 1 (where it will stay), or it loops endlessly in a cycle which does not include 1. Those numbers for which this process ends in 1 are happy numbers.
Example: 19 is a happy number
- 1^2 + 9^2 = 82
- 8^2 + 2^2 = 68
- 6^2 + 8^2 = 100
- 1^2 + 0^2 + 0^2 = 1
Credits:
Special thanks to @mithmatt and @ts for adding this problem and creating all test cases.
写一个算法判断一个数是不是快乐数。快乐数:一个正整数,如果对其各个位上的数字分别平方求和得到一个新的数,再进行同样的操作,如果结果变成了1,则说明是快乐数。
解法:循环求平方和,即求出当前数组的平方和后,再以此平方和作为新的数继续求平方和,而循环终止条件是:得到的平方和为1,或得到的平方和在之前的循环中出现过,那以后会一直循环,不可能达到1。判断平方和是否为1很简单,每次检查就好了;而判断平方和是否出现过,则只需要维持一个Set,每次循环检查当前平方和是否在Set中,在则终止循环,不在则将此平方和放到Set中。
Java:
public class Solution { public boolean isHappy(int n) { Set<Integer> got = new HashSet<>(); while (n != 1 && !got.contains(n)) { got.add(n); int sum = 0; while (n != 0) { sum += Math.pow(n % 10, 2); n /= 10; } n = sum; } return n == 1; } }
Python:
class Solution: # @param {integer} n # @return {boolean} def isHappy(self, n): lookup = {} while n != 1 and n not in lookup: lookup[n] = True n = self.nextNumber(n) return n == 1 def nextNumber(self, n): new = 0 for char in str(n): new += int(char)**2 return new
Python:
class Solution(object): def isHappy(self, n): """ :type n: int :rtype: bool """ got = set() while n != 1 and n not in got: got.add(n) sum = 0 while n: sum += (n % 10)**2 n //= 10 n = sum return n == 1
C++:
class Solution { public: bool isHappy(int n) { set<int> got; while (n != 1 && got.find(n) == got.end()) { got.insert(n); int sum = 0; while (n) { sum += pow(n % 10, 2); n /= 10; } n = sum; } return n == 1; } };