# 202. Happy Number - LeetCode Best Practices
Visit original link: [202. Happy Number - LeetCode Best Practices](https://leetcoder.net/en/leetcode/202-happy-number) for a better experience!
LeetCode link: [202. Happy Number](https://leetcode.com/problems/happy-number), difficulty: **Easy**.
## LeetCode description of "202. Happy Number"
Write an algorithm to determine if a number `n` 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.
- 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.
Return `true` if `n` is *a happy number*, and `false` if not.
### [Example 1]
**Input**: `n = 19`
**Output**: `true`
**Explanation**:
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1
### [Example 2]
**Input**: `n = 2`
**Output**: `false`
### [Constraints]
- `1 <= n <= 2^31 - 1`
## Intuition
1. It is more convenient to call `isHappy(n)` recursively. You only need to generate a new `n` as a parameter each time.
2. If `n` has already appeared, it means that the loop has been entered, and `return false`. You can use `Set` to save the `n` that has appeared.
3. Go is the iterative solution, other languages are the recursive solution.
## Steps
1. Generate a new `n` as the `isHappy(n)` parameter.
```javascript
let sum = 0
for (const digit of n.toString()) {
sum += Math.pow(Number(digit), 2)
}
// omitted code
return isHappy(sum)
```
2. If `n` has already appeared, it means that the loop has been entered, and `return false`. You can use `Set` to save the `n` that has appeared.
```javascript
var isHappy = function (n, appearedNums) { // 0
appearedNums ||= new Set() // 1
let sum = 0
for (const digit of n.toString()) {
sum += Math.pow(Number(digit), 2)
}
if (sum == 1) {
return true
}
if (appearedNums.has(sum)) { // 2
return false
}
appearedNums.add(sum) // 3
return isHappy(sum, appearedNums)
};
```
## Complexity
- Time complexity: `O(log N)`.
- Space complexity: `O(log N)`.
## Java
```java
class Solution {
private HashSet appearedNums = new HashSet<>();
public boolean isHappy(int n) {
appearedNums.add(n);
var sum = 0;
for (var digit : String.valueOf(n).toCharArray()) {
sum += Math.pow(digit - '0', 2);
}
if (sum == 1) {
return true;
}
if (appearedNums.contains(sum)) {
return false;
}
return isHappy(sum);
}
}
```
## Python
```python
class Solution:
def __init__(self):
self.appeared_nums = set()
def isHappy(self, n: int) -> bool:
self.appeared_nums.add(n)
number = sum([int(digit) ** 2 for digit in str(n)])
if number == 1:
return True
if number in self.appeared_nums:
return False
return self.isHappy(number)
```
## JavaScript
```javascript
var isHappy = function (n, appearedNums) {
appearedNums ||= new Set()
let sum = 0
for (const digit of n.toString()) {
sum += Math.pow(Number(digit), 2)
}
if (sum == 1) {
return true
}
if (appearedNums.has(sum)) {
return false
}
appearedNums.add(sum)
return isHappy(sum, appearedNums)
};
```
## C#
```csharp
public class Solution
{
HashSet appearedNums = new HashSet();
public bool IsHappy(int n)
{
appearedNums.Add(n);
int sum = 0;
foreach (char digit in n.ToString().ToCharArray())
sum += (int)Math.Pow(digit - '0', 2);
if (sum == 1)
return true;
if (appearedNums.Contains(sum))
return false;
return IsHappy(sum);
}
}
```
## Go
```go
func isHappy(n int) bool {
// Use map to track seen numbers
seen := make(map[int]bool)
for n != 1 && !seen[n] {
seen[n] = true
n = sumOfSquaredDigits(n)
}
return n == 1
}
func sumOfSquaredDigits(n int) int {
sum := 0
nStr := strconv.Itoa(n)
for i := 0; i < len(nStr); i++ {
digit := int(nStr[i] - '0')
sum += digit * digit
}
return sum
}
```
## C++
```cpp
class Solution {
public:
bool isHappy(int n) {
if (n == 1) {
return true;
}
if (appeared_nums_.count(n)) {
return false;
}
appeared_nums_.insert(n);
return isHappy(getSum(n));
}
private:
unordered_set appeared_nums_;
int getSum(int n) {
string n_str = to_string(n);
int sum = 0;
for (char digit : n_str) {
sum += (digit - '0') * (digit - '0');
}
return sum;
}
};
```
## Ruby
```ruby
def is_happy(n, appeared_nums = Set.new)
return true if n == 1
return false if appeared_nums.include?(n)
appeared_nums.add(n)
sum = n.to_s.chars.map { |digit| digit.to_i ** 2 }.sum
is_happy(sum, appeared_nums)
end
```
## Other languages
```java
// Welcome to create a PR to complete the code of this language, thanks!
```
Dear LeetCoders! For a better LeetCode problem-solving experience, please visit website [leetcoder.net](https://leetcoder.net): Dare to claim the best practices of LeetCode solutions! Will save you a lot of time!
Original link: [202. Happy Number - LeetCode Best Practices](https://leetcoder.net/en/leetcode/202-happy-number).
GitHub repository: [f*ck-leetcode](https://github.com/fuck-leetcode/fuck-leetcode).