当前位置: 首页 > news >正文

记录一种 Java 自定义快速读的方式,解决牛客中运行超时问题

        针对牛客中 “dd爱框框” 这道题的运行超时问题,分享一种 Java 自定义快速读的方式以解决该问题。题目链接:dd爱框框

题目描述如下:    

解题思路:对于本题首先想到的就是双指针思想,一个指针记录左边界,另一个指针遍历数组,期间统计遍历过的和 sum,当 sum 的值大于等于 x 时,右移记录左边界的指针,期间不断更新最小长度区间和指针位置。最终遍历完数组后得到最小长度区间的起点和最小区间长度,通过这两个变量即可输出结果。但注意的是题目要求中第一个数字位置为 1,而我们数组中第一个数字下标为 0,因此需要给 起点 和 起点+最小区间长度 都加上 1,即得到最终的结果。

具体代码如下所示

import java.util.*;
import java.io.*;
public class Main {public static void main(String[] args) throws IOException {
//         Read read = new Read();Scanner read = new Scanner(System.in);int n = read.nextInt();int x = read.nextInt();int[] arr = new int[n];for (int i = 0; i < n; i++) {arr[i] = read.nextInt();}int sum = 0;int left = -1;int index = 0;int length = Integer.MAX_VALUE;for (int i = 0; i < n; i++) {sum += arr[i];while (sum >= x) {if (i - index < length) {left = index;length = i - index;}sum -= arr[index];index++;}}System.out.println((left + 1) + " " + (left + length + 1));}
}

        经过反复分析,思路以及写法都没有问题,但在牛客中提交只能通过 20% 的用例,如下图所示。最终发现是输入方式的问题,因此学习了一种 JAVA 的快速读方式,做一个记录。

快速读的 Read 类定义如下:

import java.util.*;
import java.io.*;
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());}
}

        通过在主方法中 new 上述定义的 Read 类来进行数据的读取以替代 Scanner,更换方式后通过了该题,完整代码如下所示: 

 

import java.util.*;
import java.io.*;
public class Main {public static void main(String[] args) throws IOException {Read read = new Read();
//        Scanner read = new Scanner(System.in);int n = read.nextInt();int x = read.nextInt();int[] arr = new int[n];for (int i = 0; i < n; i++) {arr[i] = read.nextInt();}int sum = 0;int left = -1;int index = 0;int length = Integer.MAX_VALUE;for (int i = 0; i < n; i++) {sum += arr[i];while (sum >= x) {if (i - index < length) {left = index;length = i - index;}sum -= arr[index];index++;}}System.out.println((left + 1) + " " + (left + length + 1));}
}
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());}
}

 

http://www.dtcms.com/a/270199.html

相关文章:

  • 数与运算-埃氏筛 P1835 素数密度
  • go入门 - day1 - 环境搭建
  • Rust 中字符串类型区别解析
  • 10倍处理效率提升!阿里云大数据AI平台发布智能驾驶数据预处理解决方案
  • Tomcat:启用https(Windows)
  • AR/VR 显示画质失真?OAS百叶窗波导案例破难题
  • Spring Cloud 企业项目技术选型
  • Fiddler-关于抓取Android手机包,安装证书后页面加载失败,提示当前证书不可信存在安全风险的问题
  • 力扣-287.寻找重复数
  • Flutter基础(前端教程①-容器和控件位置)
  • 7月5号和6号复习和预习(C++)
  • 初识mysql(一)
  • 论文略读:UniPELT: A Unified Framework for Parameter-Efficient Language Model Tuning
  • 无人机报警器探测模块技术解析
  • HDLBits刷题笔记和一些拓展知识(十一)
  • 中文编程开发工具构件系列介绍——数值比较构件
  • 视频网站弹幕系统简易实现
  • Python语言+pytest框架+allure报告+log日志+yaml文件+mysql断言实现接口自动化框架
  • Android Handler机制与底层原理详解
  • RHA《Unity兼容AndroidStudio打Apk包》
  • 什么是2.5G交换机?
  • 【如何下载网页中的视频】
  • 【HarmonyOS】鸿蒙端云一体化开发入门详解 (一)
  • 零基础 Qt 6 在线安装教程
  • vue前置知识-end
  • 呼叫系统对接智能体能解决哪些问题?
  • exFAT文件系统mp4素材文件变0字节的恢复方法
  • Spring中过滤器和拦截器的区别及具体实现
  • ROS平台上使用C++实现A*算法
  • 3423. 循环数组中相邻元素的最大差值 — day97