作者:看那个码农
公众号:看那个码农
上期内容介绍了Go语言学习之力扣-丑数|Go主题月
- 力扣-丑数
本篇内容将继续带领大家走进Go语言的世界。
1.本文简介
Go语言学习之力扣-丑数Ⅱ
2.题目描述
给你一个整数 n,请你找出并返回第n个 丑数 。
丑数就是只包含质因数 2、3、5 的正整数。
示例 1:
输入:n = 10
输出:12
解释:[1, 2, 3, 4, 5, 6, 8, 9, 10, 12] 是由前 10 个丑数组成的序列。
示例 2:
输入:n = 1
输出:1
解释:1 通常被视为丑数。
提示:
1 <= n <= 1690
3.思路与方法
根据题目中丑数的定义可得,0和负整数一定不是丑数。
1是第一个丑数。
我们通过丑数的定义,
丑数就是只包含质因数2、3 、5的正整数。
我们可以算出所有丑数,直到算到所需的第n个丑数为止
如何计算?
我们可以根据丑数的性质,只包含2,3,5三个质因数,分别设置三个指针用来寻找丑数。
再设置一个数组用于存储从小到大遍历到的丑数。
最后返回数组中的第n个元素即可。
4.代码实现
我们针对上述的思路与方法,具体实现代码如下:
4.1 力扣上实现
力扣上实现:
func nthUglyNumber(n int) int {
if n ==0{
panic(errors.New("invalid n"))
}
num := make([]int,n)
i2:=0
i3:=0
i5:=0
num[0]=1
for i:=1;i<n;i++{
num[i]=min(num[i2]*2,min(num[i3]*3,num[i5]*5))
if num[i]==num[i2]*2{
i2+=1
}
if num[i]==num[i3]*3{
i3+=1
}
if num[i]==num[i5]*5{
i5+=1
}
}
return num[n-1]
}
func min(x, y int) int {
if x < y {
return x
}
return y
}
输出为:
4.2 本地编辑器上实现
当然由于力扣上不能导入math包,需要重新设计一个数字比较函数,导致代码比较长,我们在本地编辑器上可以这样优化代码操作:
package main
import (
"errors"
"fmt"
"math"
)
func nthUglyNumber(n int) float64{
if n ==0{
panic(errors.New("invalid n"))
}
num := make([]float64,n)
i2:=0
i3:=0
i5:=0
num[0]=1
for i:=1;i<n;i++{
a,b,c:=num[i2]*2,num[i3]*3,num[i5]*5
num[i]=math.Min(a,math.Min(b,c))
if num[i]==a{
i2+=1
}
if num[i]==b{
i3+=1
}
if num[i]==c{
i5+=1
}
}
return num[n-1]
}
func main() {
str:=0
fmt.Println("请输入需要查询并返回的丑数序号:")
fmt.Scan(&str)
fmt.Printf("第%v个丑数为:%v",str,nthUglyNumber(str))
}
输出为:
如果你觉得这篇内容对你有帮助的话:
1、点赞支持下吧,让更多的人也能看到这篇内容
2、关注公众号:看那个码农,我们一起学习一起进步。