Golang 怎么高效处理ACM模式输入输出

news/2024/10/27 15:28:48/

文章目录

  • 问题
  • bufio.NewReader
    • 高效的原理
  • 再次提交

问题

最近在练习牛客上单调栈题目时,要求自己处理出入输出,也就是读题库要求的输入,计算最终结果,并打印输出

当我用fmt.Scan处理输入,用fmt.Println处理输出时:

package mainimport "fmt"func main() {// 读取测试数据var n intfmt.Scan(&n)nums := make([]int, n)for i := 0; i < n; i++ {fmt.Scan(&nums[i])}// 执行具体算法res := f(nums)// 输出答案for _, v := range res {fmt.Println(fmt.Sprintf("%d %d", v[0], v[1]))}
}

在数据量较大时超时了。。。

在这里插入图片描述

算法本身已经是最优复杂度了,那问题只可能在输入输出上

于是研究了下用go写算法笔试题时,怎么高效处理输入输出

bufio.NewReader

读取输入:需要用带缓冲的bufio.NewReader包装os.Stdin

func main() {reader := bufio.NewReader(os.Stdin)// 读取第一行nnStr, _ := reader.ReadString('\n')n, _ := strconv.Atoi(nStr[:len(nStr)-1])nums := make([]int, n)// 读取第二行数据numsStr, _ := reader.ReadString('\n')numsStrArr := strings.Split(numsStr[:len(numsStr)-1], " ")// 解析读取每个numfor i := 0; i < n; i++ {curNum, _ := strconv.Atoi(numsStrArr[i])nums[i] = curNum}	
}

这里用到reader.ReadString('\n')方法读取每一行,表示一直读,直到遇到换行符为止

读取到每一行数据就好办了,按照空格分隔,转换成数字,调算法处理

注意:reader.ReadString返回结果的最后有换行符需要手动去掉

注意:windows换行符时 \r\n,linux/mac的换行符是:\n

如果在自己的windows电脑写代码,但提交到OJ平台(一般在linux环境执行)时,需要注意两个平台的换行符是不同的


也可以用reader.ReadLine,读取一行字符串,其返回结果没有换行符,也就不用关心环境是windows还是linux,对程序员友好

reader := bufio.NewReader(os.Stdin)
// 读第一行
nStr, _, _ := reader.ReadLine()
n, _ := strconv.Atoi(string(nStr))nums := make([]int, n)
// 读第二行
numsStr, _, _ := reader.ReadLine()// 下面处理数据
numsStrArr := strings.Split(string(numsStr), " ")
for i := 0; i < n; i++ {curNum, _ := strconv.Atoi(numsStrArr[i])nums[i] = curNum
}

输出答案也要用bufio.NewWriter包装os.Stdout

writer := bufio.NewWriter(os.Stdout)
for _, v := range res {// 先将答案输出到缓冲区,注意每行末尾增加换行符writer.WriteString(fmt.Sprintf("%d %d", v[0], v[1]) + "\n")
}
// 最后flush
writer.Flush()

高效的原理

  • bufio.Reader:先把一把大数据读到缓冲区中(默认4kb),后面程序调ReadString时,就是从缓冲区读。只会在一开始发生一次系统调用,后面都是进程内的函数调用,非常快
  • bufio.Writer先把数据写到缓冲区中(默认4kb),直到缓冲区满,或手动调Flush时才发起系统调用将数据写到os.Stdout

也就是说,通过缓冲区来降低系统调用的次数,通过空间换时间,速度当然变快了

再次提交

这次就通过了

在这里插入图片描述


http://www.ppmy.cn/news/1542367.html

相关文章

基于树型结构实现顺序结构堆

目录 前言 一、树 1、树的概念与结构 2、树的相关术语 3、二叉树 4、满二叉树 ​ 5、完全二叉树 ​ 6、二叉树的存储 1、顺序结构 2、链式结构 二、堆 1、堆的结构 2、堆的初始化 3、入堆&#xff08;大根堆&#xff09; 4、出堆&#xff08;大根堆&#xf…

Spring MVC 知识点全解析

Spring MVC 知识点全解析 Spring MVC 是一个基于 Java 的请求驱动的 Web 框架&#xff0c;属于 Spring 框架的一部分&#xff0c;广泛用于构建企业级 Web 应用程序。本文将详细阐述 Spring MVC 的核心知识点&#xff0c;包括其工作原理、关键组件、配置、请求处理、数据绑定、…

ffmpeg的视频滤镜: 抠图-chromakey

滤镜简述 chromakey 官网链接 》 https://ffmpeg.org/ffmpeg-filters.html#chromakey-1 这个滤镜主要用于抠图&#xff0c;并且背景要是纯色背景&#xff0c;比如绿幕、蓝幕。 滤镜的使用 参数 color <color> ..FV.....T. set the chromakey key c…

基于SSM轻型卡车零部件销售系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;配件类型管理&#xff0c;配件信息管理&#xff0c;订单信息管理&#xff0c;检修休息管理&#xff0c;系统管理 用户账号功能包括&#xff1a;系统首页&#xff0c;个人中心&…

虚拟现实在制造业中的应用

当你想到制造业中的虚拟现实技术时&#xff0c;你脑海中闪过的第一个念头是什么&#xff1f;从目前来看&#xff0c;只需几年时间&#xff0c;制造业就将离不开虚拟现实技术的帮助。实施虚拟现实应用对制造业来说都有诸多好处。通常情况下&#xff0c;制造设施都是由各种机器组…

15分钟学 Go 第 19 天:接口的实现

第19天&#xff1a;接口的实现 欢迎来到Go语言学习的第19天。在今天的课程中&#xff0c;我们将深入探讨如何实现接口。理解接口的实现对于掌握Go语言的编程理念至关重要&#xff0c;它将帮助我们编写模块化、可扩展的代码。今天的学习目标是“学会实现接口”。 学习目标 深…

ubuntu新装ubuntu,重启黑屏

现象&#xff1a;双系统电脑向移动硬盘安装Ubuntu系统后&#xff0c;重启黑屏并显示Minimal BASH-like line editing is supported. For the first word, TAB lists possible command completions. Anywhere else TAB lists possible device or file completions. 又拔下无法启…

Android H5页面性能分析策略

文章目录 引言一、拦截资源加载请求以优化性能二、通过JavaScript代码监控资源下载速度三、使用vConsole进行前端性能调试四、使用Chrome DevTools调试Android端五、通过抓包分析优化网络性能六、总结 引言 在移动应用开发中&#xff0c;H5页面的性能直接影响到用户体验。本文…