Java 黑客演习时间不多了

Java 黑客演习时间不多了,java,performance,Java,Performance,我从黑客那里解决了这个问题。除最后一个测试用例外,所有测试用例都是正确的,因为它没有时间了。我尝试优化我的解决方案,但我无法更好地优化它。 以下是我的解决方案: import java.util.HashSet; import java.util.Scanner; import java.util.Set; class TestClass { public static void main(String args[]) throws Exception { Scann

我从黑客那里解决了这个问题。除最后一个测试用例外,所有测试用例都是正确的,因为它没有时间了。我尝试优化我的解决方案,但我无法更好地优化它。 以下是我的解决方案:

import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;

class TestClass {

    public static void main(String args[]) throws Exception {
        Scanner sc = new Scanner(System.in);
        Set<Integer> perfectNumbers = new HashSet<>();
        for (int i = 0; i <= 20; i++) {
            perfectNumbers.add(i * i * i);
        }
        for (int i = 1; i <= 44; i++) {
            perfectNumbers.add(i * i);
        }

        int t = sc.nextInt();
        for (int k = 0; k < t; k++) {
            int db = 0;
            int n = sc.nextInt();
            int[] a = new int[1001];
            int[] b = new int[1001];
            int[] numbers = new int[n];
            for (int j = 0; j < n; j++) {
                int x = sc.nextInt();
                numbers[j] = x;
                for (Integer perfect : perfectNumbers) {
                    if (x == perfect - x) {
                        b[x]++;
                    } else if (perfect - x >= 0 && perfect - x <= 1000)
                        a[perfect - x]++;
                }
            }
            for (int j = 0; j < n; j++) {
                db += a[numbers[j]];
            }
            for (int j = 0; j <= 1000; j++) {
                if (b[j] > 1) {
                    db += b[j] * (b[j] - 1);
                }
            }

            System.out.println(db / 2);           
        }
    }
}
import java.util.HashSet;
导入java.util.Scanner;
导入java.util.Set;
类TestClass{
公共静态void main(字符串args[])引发异常{
扫描仪sc=新的扫描仪(System.in);
Set perfectNumbers=new HashSet();

对于(int i=0;i),您可能应该考虑用一些更快的方法读取输入,因为<代码>扫描器< /C> >非常慢。例如,可以将<代码>扫描器< /代码>写入<代码> BufferedReader < /代码>。 我修改了代码。现在它通过了所有测试用例:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.Set;
import java.util.StringTokenizer;

class TestClass {

    public static void main(String args[]) throws Exception {
        FastReader sc = new FastReader();
        Set<Integer> perfectNumbers = new HashSet<>();
        for (int i = 0; i <= 20; i++) {
            perfectNumbers.add(i * i * i);
        }
        for (int i = 1; i <= 44; i++) {
            perfectNumbers.add(i * i);
        }

        int t = sc.nextInt();
        for (int k = 0; k < t; k++) {
            int db = 0;
            int n = sc.nextInt();
            int[] a = new int[1001];
            int[] b = new int[1001];
            int[] numbers = new int[n];
            for (int j = 0; j < n; j++) {
                int x = sc.nextInt();
                numbers[j] = x;
                for (Integer perfect : perfectNumbers) {
                    if (x == perfect - x) {
                        b[x]++;
                    } else if (perfect - x >= 0 && perfect - x <= 1000)
                        a[perfect - x]++;
                }
            }
            for (int j = 0; j < n; j++) {
                db += a[numbers[j]];
            }
            for (int j = 0; j <= 1000; j++) {
                if (b[j] > 1) {
                    db += b[j] * (b[j] - 1);
                }
            }
            System.out.println(db / 2);
        }
    }


    static class FastReader {
        BufferedReader br;
        StringTokenizer st;

        public FastReader() {
            br = new BufferedReader(new
                    InputStreamReader(System.in));
        }

        String next() {
            while (st == null || !st.hasMoreElements()) {
                try {
                    st = new StringTokenizer(br.readLine());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            return st.nextToken();
        }

        int nextInt() {
            Integer nr=null;
            try {
                nr = Integer.parseInt(next());
            } catch (Exception e) {
                //something went wrong
            }
            return nr;
        }


    }

}
导入java.io.BufferedReader;
导入java.io.IOException;
导入java.io.InputStreamReader;
导入java.util.HashSet;
导入java.util.Set;
导入java.util.StringTokenizer;
类TestClass{
公共静态void main(字符串args[])引发异常{
FastReader sc=新的FastReader();
Set perfectNumbers=new HashSet();

对于(int i=0;我建议您从头开始。拿一张纸和一支铅笔,用文字写下解决问题的步骤。当您这样做时,您应该看到您的代码比解决问题所需的复杂得多。例如,前几个步骤是:1.读取数组的数量。2.读取每个数组并找到每个数组的数量fect pairs。这提示您可以编写两种方法:一种是读取数组,另一种是查找完美对的数量。如果您不知道该方法是什么。现在是学习的好时机。对于这些函数中的每一个,将它们分成更详细的步骤。冲洗并重复。好的,谢谢,这很有效,但我认为我的解决方案不是最好的,因为即使输入处理速度较慢,它也必须工作