快乐数
[题目]
编写一个算法来判断一个数 n 是不是快乐数。
「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果 可以变为 1,那么这个数就是快乐数。
[输入]
19
[返回]
true
解释:
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1
[解法]
维护一个map存储当前计算快乐数的结果,然后无限迭代的计算快乐数,要是计算出的结果是1,表示是快乐数,要是计算出的结果在map中存储,说明要进入一个死循环了,则表示不是快乐数
[代码实现]
package main
import "fmt"
func main() {
input := 19
result := computeResult(input)
fmt.Println("result:", result)
}
func computeResult(input int) bool {
filter := map[int]bool {}
num := input
for true {
if num == 1 {
return true
}
if _, exists := filter[num]; exists {
break
}
num = _computeNext(input)
}
return num == 1
}
func _computeNext(input int) int {
result := 0
for input > 0 {
item := input % 10
input = input / 10
result = item * item
}
return result
}
阶乘后的零
[题目]
给定一个整数 n,返回 n! 结果尾数中零的数量。
[输入1]
3
[返回1]
0
解释: 3! = 6, 尾数中没有零。
[输入2]
5
[返回2]
1
解释: 5! = 120, 尾数中有 1 个零.
[解法]
阶乘的结果中,结尾的0,是由所有子元素中成对的2和5形成的,所以我们的思路就是统计出每个元素中可以提供的成对的2和5的个数
[代码实现]
package main
import "fmt"
func main() {
input := 5
result := computeResult(input)
fmt.Println("result:", result)
}
func computeResult(input int) int {
count2 := 0
count5 := 0
for i := 2; i < input + 1; i++ {
count2 += _compute(2, i)
count5 += _compute(5, i)
}
return min(count2, count5)
}
func min(a int, b int) int {
if a < b {
return a
}
return b
}
// 计算输入数字中包含目标数字的个数
func _compute(target int, input int) int {
count := 0
num := input
for num % target == 0 {
count++
num = num / target
}
return count
}
Excel表列序号
[题目]
给定一个Excel表格中的列名称,返回其相应的列序号。
[输入1]
"A"
[返回1]
1
[输入2]
"AB"
[返回2]
28
[输入3]
"ZY"
[返回3]
701
[解法]
我们设想这样一个题目, 字符串 "123", 不使用强制类型转换,如何计算出对应的数字:
我们从头遍历,首先是 "1",将它转为1,此时结果result = 1,遍历到 "2",此时会result * 10 + 2, result = 12,遍历到 "3",此时会result * 10 + 3, result = 123,字母的转换和这个是一致的,只不过字母的进制位是26,而数字的进制位是10
[代码实现]
package main
import (
"fmt"
"strconv"
)
func main() {
input := "ZY"
result := computeResult(input)
fmt.Println("result:", result)
result2 := computeNum("321")
fmt.Println("resultNum:", result2)
}
func computeResult(input string) int {
items := []byte(input)
result := 0
for i := 0; i < len(items); i++ {
item := items[i] - 'A' + 1
result = result * 26 + int(item)
}
return result
}
func computeNum(input string) int {
items := []byte(input)
result := 0
for i := 0; i < len(items); i++ {
item, _ := strconv.Atoi(string(items[i]))
result = result * 10 + item
}
return result
}