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

文章目录

  • 问题
  • 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.rhkb.cn/news/458426.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

R语言笔记(五):Apply函数

文章目录 一、Apply Family二、apply(): rows or columns of a matrix or data frame三、Applying a custom function四、Applying a custom function "on-the-fly"五、Applying a function that takes extra arguments六、Whats the return argument?七、Optimized…

linux开机自启动三种方式

方式一、 1&#xff1a;rc.local 文件 1、执行命令&#xff1a;编辑 “/etc/rc.local” vi /ect/rc.local 2、然后在文件最后一行添加要执行程序的全路径。 例如&#xff0c;每次开机时要执行一个 hello.sh&#xff0c;这个脚本放在 / usr 下面&#xff0c;那就可以在 “/et…

深入了解 Android 中的命名空间:`xmlns:tools` 和其他常见命名空间

在 Android 开发中&#xff0c;xmlns &#xff08;.xml的namespace&#xff09;命名空间是一个非常重要的概念。通过引入不同的命名空间&#xff0c;可以使用不同的属性来设计布局、设置工具属性或者支持自定义视图等。除了 xmlns:tools 以外&#xff0c;还有很多常见的命名空间…

动态IP是什么?

随着互联网成为人们生活的重要组成部分&#xff0c;以信息传递为主导的时代种&#xff0c;网络连接质量对我们的工作效率、学习进度以及娱乐体验等方面都有很大影响。 动态IP&#xff0c;作为网络连接中的一种重要IP代理形式&#xff0c;越来越受到用户的欢迎。本文将深入解析…

计算机网络-CSMA/CD协议笔记及“争用期”的理解

假设a和b是总线型网络上相距最远的两个节点。 从零这个时刻a节点会往信道上发送数据&#xff0c;那么a节点发送的第一个比特&#xff0c;需要经过τ这么长的时间&#xff0c;也就是经过一个单向的传播时延之后。它的这个信号才可以被最远的这个节点检测到。那如果b结点在τ这个…

以bat脚本实现自动识别盘符名称

以bat脚本实现自动识别盘符名称 引言以bat脚本实现自动识别盘符名称运行结果 引言 请听题&#xff0c;如何自动识别电脑盘符的名称&#xff0c;比如&#xff0c;F盘的盘符名称为office&#xff0c;我应该如何自动识别呢&#xff1f; 这里我是以bat脚本实现 以bat脚本实现自动…

平均误差ME、均方误差MSE、均方根误差RMSE、平均均方根误差ARMSE辨析

四个性能指标的定义和作用的解释 ME(k) - 平均误差(Mean Error) 公式: M E ( k ) = ( 1 / M ) ∗ Σ ( x k − x ^ k ) , m = 1 , . . . , M ME(k) = (1/M) * Σ(xk - x̂k), m = 1, ..., M ME(k)=(1/M)∗Σ(xk−

VUE3实现古典音乐网站源码模板

文章目录 1.设计来源1.1 网站首页页面1.2 古典音乐页面1.3 著名人物页面1.4 古典乐器页面1.5 历史起源页面1.6 登录页面1.7 注册页面 2.效果和源码2.1 动态效果2.2 目录结构 源码下载万套模板&#xff0c;程序开发&#xff0c;在线开发&#xff0c;在线沟通 作者&#xff1a;xc…

【Unity踩坑】UWP应用未通过Windows应用认证:API不支持

在将Unity项目导出为XAML类型的UWP项目后&#xff0c;通过Visual Studio打包成功&#xff0c;但在进行Windows应用认证时结果是Failed。 其中的错误是某些dll里用到了Windows SDK不支持的API。 本次问题中涉及到的具体dll有两个&#xff1a;gilzoide-sqlite-net.dll和D3D12Cor…

排序

插入排序&#xff08;最有价值&#xff09; 类似于摸牌 InsertSort&#xff1a;O(N^2)&#xff1b;最好&#xff1a;O(N) 最坏情况&#xff1a;逆序有序 最好情况&#xff1a;O(N)顺序有序 比冒泡排序实际应用更高效 以下是单趟排序&#xff0c;实现多趟需要再嵌套一个fo…

IDEA初探:深入理解 Structure 功能

一、Structure - 类视图 Structure 是 IDEA 中的一个视图工具&#xff0c;它提供了对当前文件中结构元素的快速访问。通过 Structure&#xff0c;我们可以方便地查看和导航到代码中的各个部分&#xff0c;从而提高代码编辑和浏览的效率。 1.1 基本概念 Structure 视图以树形结…

数据库文档插件 screw

pom 配置 <build><plugins><plugin><groupId>cn.smallbun.screw</groupId><artifactId>screw-maven-plugin</artifactId><version>1.0.5</version><dependencies><dependency><groupId>com.zaxxer<…

高效网络自动化:Python在网络基础中的应用

高效网络自动化&#xff1a;Python在网络基础中的应用 目录 &#x1f310; TCP/IP协议与网络层次模型&#x1f4bb; 使用socket编程实现网络通信&#x1f30d; HTTP协议与RESTful API的基本概念&#x1f4e1; 使用requests库进行HTTP请求和响应处理 1. &#x1f310; TCP/IP协…

数据结构-树

目录 概念 结点分类 根结点 结点的度&#xff08;De-gree&#xff09; 树的度 结点间关系 孩子&#xff08;Child&#xff09;、双亲&#xff08;Parent&#xff09; 兄弟&#xff08;Sibing&#xff09;、堂兄弟&#xff08;Cousins&#xff09; 祖先&#xff08;anc…

VAE中的“变分”什么

写在前面 VAE&#xff08;Variational Autoencoder&#xff09;&#xff0c;中文译为变分自编码器。其中AE&#xff08;Autoencoder&#xff09;很好理解。那“变分”指的是什么呢?—其实是“变分推断”。变分推断主要用在VAE的损失函数中&#xff0c;那变分推断是什么&#x…

C++ | Leetcode C++题解之第514题自由之路

题目&#xff1a; 题解&#xff1a; class Solution { public:int findRotateSteps(string ring, string key) {int n ring.size(), m key.size();vector<int> pos[26];for (int i 0; i < n; i) {pos[ring[i] - a].push_back(i);}vector<vector<int>>…

linux指令笔记

bash命令行讲解 lyt &#xff1a;是用户名 iZbp1i65rwtrfbmjetete2b2Z :这个是主机名 ~ &#xff1a;这个是当前目录 $ &#xff1a;这个是命令行提示符 每个指令都有不同的功能&#xff0c;大部分指令都可以带上选项来实现不同的效果。 一般指令和选项的格式&#xff1a;…

Linux 重启命令全解析:深入理解与应用指南

Linux 重启命令全解析&#xff1a;深入理解与应用指南 在 Linux 系统中&#xff0c;掌握正确的重启命令是确保系统稳定运行和进行必要维护的关键技能。本文将深入解析 Linux 中常见的重启命令&#xff0c;包括功能、用法、适用场景及注意事项。 一、reboot 命令 功能简介 re…

洛谷 P3130 [USACO15DEC] Counting Haybale P

原题链接 题目本质&#xff1a;线段树 感觉我对线段树稍有敏感&#xff0c;线段树一眼就看出来了&#xff0c;思路出来得也快&#xff0c;这道题也并不是很难。 解题思路&#xff1a; 这道题能看出来是线段树就基本成功一半了&#xff0c;区间修改区间查询&#xff0c;就基…

深入探索:深度学习在时间序列预测中的强大应用与实现

引言&#xff1a; 时间序列分析是数据科学和机器学习中一个重要的研究领域&#xff0c;广泛应用于金融市场、天气预报、能源管理、交通预测、健康监控等多个领域。时间序列数据具有顺序相关性&#xff0c;通常展示出时间上较强的依赖性&#xff0c;因此简单的传统回归模型往往…