浅谈 刷算法题时遇到运行超时异常 的解决办法

文章目录

  • 一、背景介绍
  • 二、解决办法
    • 2.1 C/C++ 语言
    • 2.2 Java 语言
      • 2.2.1 ACM模式下 Java的I/O原理
  • 三、模板详情

一、背景介绍

最近在牛客、leetcode 刷算法题时发现一个奇怪的问题,明明解题思路、所用算法与题解一致,并且在本地IDE运行是通过的,但是在牛客、leetcode 却没办法AC,出现一个叫做 运行超时 的异常。通过查阅资料、反复验证之后,找出了一个有效的解决办法。
在这里插入图片描述

二、解决办法

2.1 C/C++ 语言

针对使用 C/C++ 语言刷算法题遇到 运行超时异常 问题的同学,可以将输入/输出 换成 scanf/printf,此时极大概率就能通过

2.2 Java 语言

针对使用 Java 语言刷算法题时遇到 运行超时异常 问题的同学,就比较麻烦了,需要速记牢背一个 Java快速 IO 的模板,牢记这个模板之前我们需要先了解牛客、leetcode 在刷算法题时给我们提供的 ACM模式进行编程时(一般会给出两种模式进行编写代码,1、核心代码模式,即给出一个函数/方法,在此函数里书写题目的解决逻辑即可。2、ACM模式:给出Main类、main方法,其他没给出,需要书写解题时需用到的全部代码,包括引入的包名,都需要自己手动书写。一般工作时笔试中,做编程题时,给出的都是ACM模式),其进行I/O的流程。

2.2.1 ACM模式下 Java的I/O原理

对于 ACM模式 下,Java 进行 I/O的流程:
输入情况下(Java 使用 new Scanner(System.in) 进行输入数据):
在这里插入图片描述
输出情况下(Java 使用 System.out 进行输出数据):
在这里插入图片描述
从上述ACM模式下进行输入输出的原理图中,我们就能清楚知道使用 Java 自带的 Scanner / System.out 进行输入输出时,每次 输入/输出 都需要访问I/O设备,但访问一次I/O设备又是很慢的,因此代码量庞大的情况下,就会出现 运行超时异常问题。

Java 快速 I/O 模板:

import java.util.*;
import java.io.*;

public class Main
{
    public static PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
    public static Read in = new Read();
    
    public static void main(String[] args) throws IOException
    {
        // 写代码

        out.close();
    }
}


class Read // 自定义快速读入
{
    StringTokenizer st = new StringTokenizer("");
    BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
    String next() throws IOException 
    {
        while(!st.hasMoreTokens())
        {
            st = new StringTokenizer(bf.readLine());
        }
        return st.nextToken();
    }
    
    String nextLine() throws IOException 
    {
        return bf.readLine();
    }
    
    int nextInt() throws IOException 
    {
        return Integer.parseInt(next());
    }
    
    long nextLong() throws IOException 
    {
        return Long.parseLong(next());
    }
    
    double nextDouble() throws IOException 
    {
        return Double.parseDouble(next());
    }
    
    float nextFloat() throws IOException{
        return Float.parseFloat(next());
    }
}

希望使用 Java 作为 主编程语言的同学能够牢记这个 快速读写模板,不仅仅是我们日常在 牛客、leetcode 上进行 刷题 会用到,真正在找工作,进入笔试阶段书写编程题时,我们更会用到。所以这个模板必须要熟记于心,并且能够在3分钟内默写出来是最好的。

三、模板详情

可能有同学不清楚这个模板中的代码原理,我在这里简单解释一下,方便大家弄清原理后,更快速的记住这个模板。

1、首先,输出时,我们在模板中使用 字符流BufferedWriter 代替 字节流System.out 进行输出数据。
在这里插入图片描述
我们将 原来的 输出字节流 System.out 使用 输出字符流 BufferedWriter 代替,这是因为 字符流 自带 内存缓冲区,此时就会将 存储在I/O设备文件中的数据移到字符流自带的内存缓冲区里,每次输出时就在这个字符缓冲区内放数据,当不再进行输出时,一次性将数据放到 I/O设备的文件上即可。由于访问内存比访问I/O设备要快得多,同时,最后只需要访问一次I/O设备,这大大加快了写入的速度,造成 运行超时异常的概率大大降低。同时再在 BufferedWriter 上封装一层 PrintWriter,是由于 PrintWriter类中的输出形式与原来的输出形式一致,都是 print/printf, 此时输出时就可以使用 print/println 进行输出,不至于突然使用陌生的输出而出现陌生/不适应/不顺手的情况。当然,最后是否封装 printWriter 这一层都行,看自己的使用习惯。

在这里插入图片描述

2、使用 字符流 BufferedReader 代替 字节流 System.in 进行 输入数据。

在这里插入图片描述
我们自定义了一个 Read 类,通过这个类,实现 原来输入时使用 Scanner.in 类中的所有nextxx()方法。在这个 Read 类中,首先定义了一个 StringTokenizer 类型的 st 对象,使用 StringTokenizer 类的构造方法,传入了一个 空字符串,因此此时的 st 对象 是一个空字符串。
在这里插入图片描述
然后又定义了一个 BufferedReader 类,使用 字符流 替代 字节流,这里的原理跟上面输出使用的 BufferedWriter 原理都是一样的,他们都自带内存缓冲区,那么此时使用 nextxx() 方法进行输入数据时,会直接从内存缓冲区中拿取数据,同样的,访问内存的速度远比于访问I/O的速度要快得多,此时发生 运行超时异常 的概率就会大大降低。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/560657.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【HTML】H5新增元素记录

H5 新增元素特性 1. 语义化标签 语义化标签的好处: 对于浏览器来说,标签不够语义化对于搜索引擎来说,不利于SEO的优化 语义化标签: header:头部元素nav:导航section:定义文档某个区域的元素article:内容元素aside…

深度学习:Pytorch分布式训练

深度学习:Pytorch分布式训练 简介模型并行数据并行参考文献 简介 在深度学习领域,模型越来越庞大、数据量不断增加,训练这些大型模型越来越耗时。通过在多个GPU或多个节点上并行地训练模型,我们可以显著减少训练时间。此外&#…

python学习 | 我有两个dataframe,想通过某1列进行匹配

需求 我有两个dataframe,第1个dataframe A的columns是[‘id’, ‘A’, ‘B’, ‘C’],第2个dataframe B的columns是[‘id’, ‘1’, ‘2’, ‘3’],其中’id’列A是B的子集,我想通过’id’列进行匹配,把A给扩充成[‘i…

js 特定索引下拆分字符串并组建成新的字符串数据

要在特定索引处拆分字符串,请使用 slice 方法获取字符串的两个部分,例如 str.slice(0, index) 返回字符串的一部分,但不包括提供的索引,而 str.slice(index) 返回字符串的其余部分。 过程:我们创建一个可重用的变量&a…

「GO基础」目录

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

删除word中下划线的内容

当试卷的题目直接含答案,不利用我们刷题。这时如果能够把下划线的内容删掉,那么将有利于我们复习。 删除下划线内容的具体做法: ①按ctrl H ②点格式下面的字体 ③选择下划线线型中的_____ ④勾选使用通配符并在查找内容中输入"?&qu…

Linux 序列化、反序列化、实现网络版计算器

目录 一、序列化与反序列化 1、序列化(Serialization) 2、反序列化(Deserialization) 3、Linux环境中的应用实例 二、实现网络版计算器 Sock.hpp TcpServer.hpp Jsoncpp库 Protocol.hpp 类 Request 类 Response 辅助函…

SQLite数据库中JSON 函数和运算符(二十七)

返回:SQLite—系列文章目录 上一篇:维护SQLite的私有分支(二十六) 下一篇:SQLite—系列文章目录 ​1. 概述 默认情况下,SQLite 支持 29 个函数和 2 个运算符 处理 JSON 值。还有两个表值函数可用于分解 JSON 字…

程序员自由创业周记#32:新产品构思

程序员自由创业周记#32:新产品构思 新作品 我时常把自己看做一位木匠,有点手艺,能做一些作品养活自己。而 加一、Island Widgets、Nap 就是我的作品。 接下来在持续维护迭代的同时,要开启下一个作品的创造了。 其实早在2022的1…

【C++初阶】List使用特性及其模拟实现

1. list的介绍及使用 1.1 list的介绍 1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。 2. list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前…

(2022级)成都工业学院数据库原理及应用实验五: SQL复杂查询

写在前面 1、基于2022级软件工程/计算机科学与技术实验指导书 2、成品仅提供参考 3、如果成品不满足你的要求,请寻求其他的途径 运行环境 window11家庭版 Navicat Premium 16 Mysql 8.0.36 实验要求 在实验三的基础上完成下列查询: 1、查询医生…

漆包线行业你了解多少?专业漆包线行业MES生产管理系统

今天就说说漆包线行业,漆包线是工业电机(包括电动机和发电机)、变压器、电工仪表、电力及电子元器件、电动工具、家用电器、汽车电器等用来绕制电磁线圈的主要材料。 漆包线上游是铜杆行业,下游是各种消费终端,主要是电…

[大模型]Qwen-Audio-chat FastApi 部署调用

Qwen-Audio-chat FastApi 部署调用 Qwen-Audio 介绍 Qwen-Audio 是阿里云研发的大规模音频语言模型(Large Audio Language Model)。Qwen-Audio 可以以多种音频 (包括说话人语音、自然音、音乐、歌声)和文本作为输入,并以文本作为…

Linux-用户管理类命令实训

查看根目录下有哪些内容 进入/tmp目录,以自己的学号建一个目录,并进入该目录 像是目前所在的目录 在当前目录下,建立权限为741的目录test1 在目录test1下建立目录test2/test3/test4 进入test2,删除目录test3/test4 (7&…

Python实现在线翻译工具

Python实现在线翻译工具 使用Python的内置的标准库tkinter和webbrowser,实现一个简单Python在线翻译工具。 tkinter库用来创建一个图形用户界面(GUI),webbrowser库用来打开网页。 webbrowser 是 Python 的一个标准库&#xff0…

7.MMD 法线贴图的设置与调教

前期准备 人物 导入温迪模型导入ray.x和ray_controler.pmx导入天空盒time of day调成模型绘制顺序,将天空盒调到最上方给温迪模型添加main.fx材质在自发光一栏,给天空盒添加time of lighting材质 打开材质里的衣服,发现只有一个衣服文件 …

SpringBoot集成FTP

1.加入核心依赖 <dependency><groupId>commons-net</groupId><artifactId>commons-net</artifactId><version>3.8.0</version></dependency> 完整依赖 <dependencies><dependency><groupId>org.springfra…

什么是时间序列分析

时间序列分析是现代计量经济学的重要内容&#xff0c;广泛应用于经济、商业、社会问题研究中&#xff0c;在指标预测中具有重要地位&#xff0c;是研究统计指标动态特征和周期特征及相关关系的重要方法。 一、基本概念 经济社会现象随着时间的推移留下运行轨迹&#xff0c;按…

Linux网络编程--网络传输

Linux网络编程--网络传输 Linux网络编程TCP/IP网络模型网络通信的过程局域网通信跨网络通信&#xff1a;问题总结&#xff1a; Linux网络编程 TCP/IP网络模型 发送方&#xff08;包装&#xff09;&#xff1a; 应用层&#xff1a;HTTP HTTPS SSH等 —> 包含数据&#xff0…

二维码门楼牌管理应用平台建设:助力场所整改与消防安全

文章目录 前言一、二维码门楼牌管理应用平台的构建背景二、二维码门楼牌管理应用平台在场所整改中的作用三、二维码门楼牌管理应用平台的意义与价值四、二维码门楼牌管理应用平台的未来展望 前言 随着城市管理的日益精细化&#xff0c;二维码门楼牌管理应用平台的建设成为了提…