-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path202-HappyNumber.go
More file actions
83 lines (73 loc) · 1.85 KB
/
202-HappyNumber.go
File metadata and controls
83 lines (73 loc) · 1.85 KB
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
package main
// 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:
// 1^2 + 9^2 = 82
// 8^2 + 2^2 = 68
// 6^2 + 8^2 = 100
// 1^2 + 0^2 + 0^2 = 1
// Example 2:
// Input: n = 2
// Output: false
// Constraints:
// 1 <= n <= 2^31 - 1
import "fmt"
// n = 7 有问题
// func isHappy(n int) bool {
// if n == 1 {
// return true
// }
// if n < 10 {
// return false
// }
// sum, a := 0,0
// for n > 0 {
// a = n % 10
// sum += a * a
// n = n / 10
// }
// return isHappy(sum)
// }
// 快慢指针
func isHappy(n int) bool {
// 快慢指针:最终会相遇,有循环,当相遇时即完成一个循环
// 判断循环的结尾/开始是不是符合预期
if n == 1 {
return true
}
bitSquare := func (n int) int {
if n == 1 {
return 1
}
res := 0
for n > 0 {
x := n % 10
res += x * x
n = n / 10
}
return res
}
fast, slow := bitSquare(n), n
for fast != slow {
fast = bitSquare(fast)
fast = bitSquare(fast)
slow = bitSquare(slow)
}
return fast == 1
}
func main() {
// 1^2 + 9^2 = 82
// 8^2 + 2^2 = 68
// 6^2 + 8^2 = 100
// 1^2 + 0^2 + 0^2 = 1
fmt.Println(isHappy(19)) // true
fmt.Println(isHappy(2)) // false
}