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。这提示您可以编写两种方法:一种是读取数组,另一种是查找完美对的数量。如果您不知道该方法是什么。现在是学习的好时机。对于这些函数中的每一个,将它们分成更详细的步骤。冲洗并重复。好的,谢谢,这很有效,但我认为我的解决方案不是最好的,因为即使输入处理速度较慢,它也必须工作