第一题 高兴数

题目

解题思路

首先

咱们天然须要一个计算高兴数的函数

每一次计算高兴数都是将该数替换为每个地位数字的平方和

var s func(int)int    s = func(n int)int{        sum:=0        for n>=10{            i:=n%10            sum+=i*i            n=n/10        }        sum+=n*n        return sum    }

这样
咱们只有调用函数

n=s(n)

就实现了一次高兴数的计算

另外

高兴数的计算可能是有限循环

为了避免程序进入计算高兴数的死循环
退出哈希表存储曾经计算过的数字
如果计算出的高兴数已存在于哈希表则阐明进入了循环
返回失败

如果计算出高兴数为1
则该数为高兴数
返回正确

具体代码

func isHappy(n int) bool {    var s func(int)int    s = func(n int)int{        sum:=0        for n>=10{            i:=n%10            sum+=i*i            n=n/10        }        sum+=n*n        return sum    }    m:=make(map[int]bool)    m[n]=true    for n!=1{        n=s(n)        if m[n]{            return false        }        m[n]=true    }    return true}

成果

官网解答更简洁的代码

func isHappy(n int) bool {    m := map[int]bool{}    for ; n != 1 && !m[n]; n, m[n] = step(n), true { }    return n == 1}func step(n int) int {    sum := 0    for n > 0 {        sum += (n%10) * (n%10)        n = n/10    }    return sum}作者:LeetCode-Solution链接:https://leetcode-cn.com/problems/happy-number/solution/kuai-le-shu-by-leetcode-solution/起源:力扣(LeetCode)著作权归作者所有。商业转载请分割作者取得受权,非商业转载请注明出处。

另外补充对于题目的剖析补充

为什么只须要思考1或者循环的状况

复杂度剖析

其余解法

第二题 阶乘后的零

题目

间接计算

最简略的初始想法天然是

计算出n的阶乘,再计算其尾部带有几个0

留神
在计算阶乘的时候,咱们须要思考溢出状况
否则咱们便会失去如下后果

阶乘的计算能够应用bit包
详见
https://blog.csdn.net/hudmhac...

找5


代码

func trailingZeroes(n int) int {    res := 0    mul := 5    for n >= mul {        res += (n / mul)        mul *= 5    }    return res}

例如n=30
第一遍循环 temp=5 找到 n/5 = 6 个5的因子
第二遍 temp=25 找到 n/25 = 1 个 5 的因子
第三遍 temp=125 n=30时不含125的倍数 无需思考,退出循环

因而30!最终会有7个0在前面

复杂度剖析