HJ3 明明的随机数

本文讲述了作者使用Go语言解题的过程,通过暴力解法、哈希表优化和内存减少的尝试,发现性能差异主要受测评机环境影响,最终确定在数据量不大的情况下,哈希表配合排序是有效的方法。
摘要由CSDN通过智能技术生成

牛客网:HJ3 明明的随机数
https://www.nowcoder.com/practice/3245215fffb84b7b81285493eae92ff0?tpId=37&tqId=21226&ru=/exam/oj

在这里插入图片描述
使用Go语言解题,最简单的方式:
解题一:

// 运行时间:5ms 占用内存:1180KB
package main

import (
	"fmt"
	"sort"
)

func main() {
	var n int
	num := make([]int, 0, n)
	_, _ = fmt.Scan(&n)
	set := make(map[int]struct{}, n)
	for i := 0; i < n; i++ {
		var tmp int
		_, _ = fmt.Scan(&tmp)
		if _, ok := set[tmp]; ok {
			continue // 重复值跳过
		}
		set[tmp] = struct{}{}
		num = append(num, tmp)
	}
	sort.Ints(num)
	for _, number := range num {
		fmt.Println(number)
	}
}

解题比较暴力,直接去重后再排序,思索后,觉得应该有所优化,从样例数据来看,数据量并不大,似乎可以用哈希表解题;
解题二:

// 运行时间:5ms 占用内存:1052KB
package main

import (
	"fmt"
)

func main() {
	var n int
	_, _ = fmt.Scan(&n)
	set := make([]int, 500, 500)
	for i := 0; i < n; i++ {
		var tmp int
		_, _ = fmt.Scan(&tmp)
		set[tmp] = tmp
	}
	for _, number := range set {
		if number != 0 {
			fmt.Println(number)
		}

	}
}

提交后,发现与第一种代码的运行时间和内存占比相差不大,开始查阅排行榜大哥代码,发现耗时原因出现在数据的录入上,修改代码重新提交
解题三:

//运行时间:4ms 占用内存:1308KB
package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
)

func main() {
	scan := bufio.NewScanner(os.Stdin)
	scan.Scan()
	if len(scan.Text())==0{
		return
	}
	n,_:=strconv.Atoi(scan.Text())
	set := make([]int, 500, 500)
	for i := 0; i < n; i++ {
		scan.Scan()
		tmpStr := scan.Text()
		tmp,_:=strconv.Atoi(tmpStr)
		set[tmp] = tmp
	}
	for _, number := range set {
		if number != 0 {
			fmt.Println(number)
		}
	}
}

运行时间缩短了1ms,内存涨了250kb,再次修改代码
解题四:

// 运行时间:4ms 占用内存:1096KB
package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
)

func main() {
	scan := bufio.NewScanner(os.Stdin)
	scan.Scan()
	if len(scan.Text())==0{
		return
	}
	n,_:=strconv.Atoi(scan.Text())
	set := make([]bool, 500, 500)
	for i := 0; i < n; i++ {
		scan.Scan()
		tmpStr := scan.Text()
		tmp,_:=strconv.Atoi(tmpStr)
		set[tmp] = true
	}
	for number, v := range set {
		if v == true {
			fmt.Println(number)
		}
	}
}

内存缩小,时间未变,不太理解,找到排行榜第一的代码进行提交,终于找到原因:
在这里插入图片描述
相同的代码,运行时间差距和内存差距,存在于牛客网的测评机,与代码无关,放弃挣扎;使用哈希表和sort在数据量不大的情况下,解决这道题,没有过多优化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值