Go语言学习之力扣-丑数Ⅱ|Go主题月

316 阅读1分钟

作者:看那个码农

公众号:看那个码农

上期内容介绍了Go语言学习之力扣-丑数|Go主题月

  • 力扣-丑数

本篇内容将继续带领大家走进Go语言的世界。

1.本文简介

Go语言学习之力扣-丑数Ⅱ

来源于:Leetcode264. 丑数 II

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
}

输出为:

image.png

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))
}

输出为:

image.png

如果你觉得这篇内容对你有帮助的话:

1、点赞支持下吧,让更多的人也能看到这篇内容

2、关注公众号:看那个码农,我们一起学习一起进步。