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

每日一题---dd爱框框(Java中输入数据过多)

dd爱框框

实例:

输入:

10 20
1 1 6 10 9 3 3 5 3 7

 输出:

3 5

这道题要解决Java中输入的数过多时,时间不足的的问题。

应用这个输入模板即可解决:

Java中输入大量数据

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

public class Main {
    public static void main(String[] args) throws IOException {
        Read in = new Read();
    }
}

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());
    }
    Double nextDouble() throws IOException{
        return Double.parseDouble(next());
    }
    long nextLong() throws IOException{
        return Long.parseLong(next());
    }
}

稍微解释一下代码的作用,通过BufferedReader更改字节流输入字符流输入,加速快字符的输入

再通过StringTokenizer将输入的字符串进行切割,用于下一步的转换。

对于nextLine()这个方法由于输入时是String得到的也是String,就可以直接返回BufferedReader

中读取的字符串。

而对于其他比如nextInt()需要进行切割后用Integer.parseInt()转化,所以统一把切割这一步封装为next()。

st.hasMoreTokens()这个用于读取多行,其他的就记住就行。

封装完成后的使用方法与Scanner一致。

接下来讲解这道题:

题解:

解法一:暴力解法

我做题如果不是熟悉的题,基本第一时间还是想到的暴力遍历,然后再优化。

对于这道题来说,把所有情况统计下来,还要兼顾长度相同时,取最小的l的情况,无疑是不能通过的。那么如何进行优化呢?

有了之前这种题的经验:数组中两个字符串的最小距离,我想到继续用临时变量取存储,然后再不断更新,因此,我们现在就尝试寻找满足这样的条件是什么。

要存储那个变量呢?结果要输出左右下标,那么这个肯定优先考虑,那么还有其他的需要考虑吗,意识到要遍历所有的情况,我们可以定义两套变量,一套用于遍历所有情况,一套用于存储输出结果,并且结合题目还要计算数组和,所以这个也要定义。

下面要考虑什么时候更新数据,当遍历到的数据和满足 >x时,判断是否小于输出结果记录的值,然后更新,有点像双指针的思路,从头开始遍历时,如果和大于x后就两头向内坍缩,但由于是向右遍历的,那么右边的就可以不用向回走(因为题目中要求的x一定是大于0的),比如1,2,3这一组数,如果x=5,那么左边就可以减少一个,但是右边就没必要减,如果右边也可以减,那么这组遍历在1,2就会因为>x而停下。

代码:

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

public class Main {
    public static void main(String[] args) throws IOException {
        Read in = new Read();
        int n = in.nextInt();
        int x = in.nextInt();
        int[] arr = new int[n+1];
        for(int i = 1; i <= n; i++) {
            arr[i] = in.nextInt();
        }
        //记录遍历数据与输出数据
        int l = 1, retl = -1;
        int r = 1, retr = -1;
        int count = 0;
        int ret = n;
        while(r <= n) {
          //统计和
            count += arr[r];
            while(count >= x) {//注意这个等号,恰好相等时也要更新
                  //向内坍缩  双指针
                if(r - l + 1 < ret) {//保证输出的是l最小的
                    retl = l;
                    retr = r;
                    ret = r-l+1;
                }
                count -= arr[l++];
            }
            r++;
        }
        System.out.println(retl + " " + retr);
    }
}

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());
    }
    Double nextDouble() throws IOException{
        return Double.parseDouble(next());
    }
    long nextLong() throws IOException{
        return Long.parseLong(next());
    }
}

相关文章:

  • JVM 2015/3/15
  • 《我的Python觉醒之路》之转型Python(十三)——控制流
  • GetCurrentTime
  • 具身系列——零样本倒水任务
  • 基于大模型预测的难治性青光眼诊疗方案研究报告
  • RCE-Labs超详细WP-Level10(无字母命令执行_二进制整数替换)
  • Trae与Builder模式初体验
  • fastapi +angular​迷宫求解可跨域
  • Brian Kernighan算法
  • 【模拟算法】
  • requests库的request和response对象的属性和方法
  • 【PTA题目解答】7-4 数气球 (20分)
  • 清明祭祖(原创)
  • C++Primer学习(7.1 定义抽象数据类型)
  • 助力字体管理,规避设计卡顿的得力工具
  • 详解SQL数据定义功能
  • C++【类和对象】(结束篇)
  • 游戏引擎学习第160天
  • GHCTF web方向题解
  • Next.js项目MindAI教程 - 第七章:社区功能实现
  • 中纪报:强化监督推动过紧日子要求落到实处
  • 多所院校高规格召开考研动员会,有学院考研报名率达84%
  • 海军“吉祥方舟”号医院船开展海上卫勤演练
  • 盲人不能刷脸认证、营业厅拒人工核验,央媒:别让刷脸困住尊严
  • 泽连斯基与美国副总统及国务卿会谈,讨论伊斯坦布尔谈判等问题
  • 国际博物馆日|在辽宁省博物馆遇见敦煌