题解 | #丑数#

丑数

https://www.nowcoder.com/practice/6aa9e04fc3794f68acf8778237ba065b

package main

import (
    "container/heap"
)
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param index int整型 
 * @return int整型
*/
type IntHeap []int
func (h IntHeap) Len() int {
    return len(h)
}
func (h IntHeap) Swap(i, j int) {
    h[i], h[j] = h[j], h[i]
}
func (h IntHeap) Less(i, j int) bool {
    return h[i] < h[j]
}
func (h *IntHeap) Push(x interface{}) {
    *h = append(*h, x.(int))
}
func (h *IntHeap) Pop() interface{} {
    x := (*h)[h.Len()-1]
    *h = (*h)[:h.Len()-1]
    return x
}

func GetUglyNumber_Solution( index int ) int {
    // write code here
    if index <= 6 {
        return index
    }
    // heap.Interface
    h := &IntHeap{1}
    // heap.Init(heap.Interface) 初始建堆
    heap.Init(h)
    factors := []int{2, 3, 5}
    exist := map[int]bool{1: true}
    for i := 0; i < index; i++ {
        // 小根堆弹出堆顶元素
        x := heap.Pop(h).(int)
        // 已经使用了,删除
        delete(exist, x)
        // 当 i == index-1,说明 x 就是第 index 个丑数(我们从 0 开始的)
        if i == index-1 {
            return x
        }
        for _, fac := range factors {
            // 如果这个丑数还没有被遍历到,那么入堆
            // 比如 x = 1 计算的三个新的堆元素分别为 2 3 5
            // 下一次弹出 x = 2 计算出的新的堆元素为 4 6 10
            // 再下一次弹出 3,计算出的新的堆元素为 6 9 15 和之前的 6 出现了重复,因此我们使用 map 就是为了去重的
            if _, ok := exist[x*fac]; !ok {
                heap.Push(h, x*fac)
                exist[x*fac] = true
            }
        }
    }

    return 1
}

全部评论

相关推荐

不愿透露姓名的神秘牛友
07-04 18:06
点赞 评论 收藏
分享
头顶尖尖的程序员:我是26届的不太懂,25届不应该是找的正式工作吗?为什么还在找实习?大四还实习的话是为了能转正的的岗位吗
点赞 评论 收藏
分享
Twilight_m...:表格简历有点难绷。说说个人看法: 1.个人基本情况里好多无意义信息,什么婚姻状况、健康状况、兴趣爱好、户口所在地、身份证号码、邮政编码,不知道的以为你填什么申请表呢。 2.校内实践个人认为对找工作几乎没帮助,建议换成和测开有关的项目,实在没得写留着也行。 3.工作经历完全看不出来是干什么的,起码看着和计算机没啥关系,建议加强描述,写点你在工作期间的实际产出、解决了什么问题。 4.个人简述大而空,看着像AI生成,感觉问题最大。“Python,C,C++成为我打造高效稳定服务的得力工具”、“我渴望凭借自身技术知识与创新能力,推动人工智能技术的应用发展,助力社会实现智能化转型”有种小学作文的美感。而且你确定你个人简述里写的你都会嘛?你AI这块写的什么“深入研究”,发几篇顶会的硕博生都不一定敢这么写。而且你AI这块的能力和软测也完全无关啊。个人简述建议写你对哪些技术栈、哪些语言、哪些生产工具的掌握,写的有条理些,而且最好是和测开强相关的。
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务