【问题标题】:Possible Workaround for Optimal solution for split function in java while reading multiple lines?在读取多行时,Java 中拆分函数的最佳解决方案的可能解决方法?
【发布时间】:2015-05-14 07:09:23
【问题描述】:

输入以单行 (t<=10) 中的测试用例数 t 开头。在接下来的 t 行中的每一行中,有两个或多个数字 m 和 n (1 <= m <= n <= 1000000000, n-m<=100000) 以空格分隔。

将每个数字打印在单独的行中,可以进一步用于求和

输入

2

50 100

100 50 105

输出

50

100

100

50

105

现在这是我写的给我输出的代码

import java.util.Scanner;
import java.util.StringTokenizer;

public class Generation {

    public static void main(String[] str) {

        Scanner keyboard = new Scanner(System.in);
        int inputSize;
        do {
            System.out.println("Enter the value of T Size");
            inputSize = keyboard.nextInt();
            keyboard.nextLine();
            if (inputSize < 2 || inputSize > 10) {
                System.out.println("Not a Valid Input Size");
            }
        } while (inputSize < 2 || inputSize > 10);

        String[] inputValue = new String[inputSize];
        int tokenCount = 0;
        for (int i = 0; i < inputSize; i++) {
            System.out.println("Enter the inputs");
            inputValue[i] = keyboard.nextLine();
            StringTokenizer strToken = new StringTokenizer(inputValue[i], " ");
            tokenCount += strToken.countTokens();
        }
        keyboard.close();

        //suppose this is 2nd part 
        int[] splitedString = new int[tokenCount];
        int tempTokenCount = 0;
        for (int i = 0; i < inputSize; i++) {
            String[] tempSplitArray = inputValue[i].split(" ");
            for (int j = 0; j < tempSplitArray.length; j++) {
                splitedString[tempTokenCount] = Integer
                        .parseInt(tempSplitArray[j]);
                tempTokenCount++;
            }

        }
        /*for (String s : inputValue) {
            System.out.println(s);
        }*/
        for (Integer s : splitedString) {
            System.out.println(s);
        }

    }

}

现在我的问题是如何优化我必须使用两个 for 循环的第二部分,这会导致 O(npower2) 时间复杂度。这种情况的解决方法是什么?

【问题讨论】:

  • 你可以使用split()方法来代替StringTokenizer
  • 为什么不直接通过Scanner读取输入流?
  • @Prashant 这将如何改变时间复杂度?
  • @TagirValeev 您能否提供一个指导链接或显示可能的解决方法,因为这些值也必须用于求和
  • @TagirValeev 另见顶部提到的要求

标签: java optimization java.util.scanner string-split


【解决方案1】:

您关心性能,我看到您对这些问题有一些了解(考虑功率时间复杂度),但我认为您并不完全理解这意味着什么。

仅仅因为你的程序有嵌套循环,并不意味着它比单循环的效率低(很多)。外层循环遍历每一行,内层循环遍历令牌(数量不同),因此迭代的总次数是令牌的总数,与任何幂律无关。

性能的主要问题是你有太多的代码来做一件非常简单的事情,而且你正在使用临时数组、扫描器、解析器,这些都会增加它的开销。您可以使用以下代码读取包含它的文件:

import java.util.Scanner;

public class Scan {

    public static void main(String args[]) {

        Scanner keyboard = new Scanner(System.in);

        int i;

        while (keyboard.hasNext()) {
            try {
                i = keyboard.nextInt();
                System.out.println(i);
            } catch(Exception e) {
                // Whatever  
                System.err.println(e.getMessage());
                System.exit(1);
            }
        }
    }
}

这将完成您的课程的大部分工作,此外还可以捕获异常。它唯一不做的就是读取初始行数。实际上,在扫描仪中计算行数很困难,因为它并不真正支持它,但也许你可以不用它或有其他解决方案。

【讨论】:

    猜你喜欢
    • 2023-03-13
    • 1970-01-01
    • 2020-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-11
    • 2010-11-05
    • 1970-01-01
    相关资源
    最近更新 更多