我正在HackerRank上进行此练习:
为您提供了一个数组,您需要查找索引(i,j,k)的三元组数,以使对于给定的公共比率r和i
完全运动:https://www.hackerrank.com/challenges/count-triplets-1/problem 我的编译器有问题。 这是代码:
import java.io.*;
import java.math.*;
import java.security.*;
import java.text.*;
import java.util.*;
import java.util.concurrent.*;
import java.util.function.*;
import java.util.regex.*;
import java.util.stream.*;
import static java.util.stream.Collectors.joining;
import static java.util.stream.Collectors.toList;
public class Solution {
// Complete the countTriplets function below.
static long countTriplets(List<Long> arr, long r) {
int counter = 0;
for (int i = 0; i < arr.length() - 2; i++) {
for (int j = i + 1; j < arr.length() - 1; j++) {
if (arr[j] - arr[i] == r) {
for (int k = j + 1; k < arr.length(); k++) {
if (arr[k] - arr[j] == r) {
System.out.println("(" + arr[i] + "," + arr[j] + "," + arr[k] + ")");
counter++;
break;
}
}
}
}
}
;
return counter;
}
public static void main(String[] args) throws IOException {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(System.getenv("OUTPUT_PATH")));
String[] nr = bufferedReader.readLine().replaceAll("\\s+$", "").split(" ");
int n = Integer.parseInt(nr[0]);
long r = Long.parseLong(nr[1]);
List<Long> arr = Stream.of(bufferedReader.readLine().replaceAll("\\s+$", "").split(" ")).map(Long::parseLong)
.collect(toList());
long ans = countTriplets(arr, r);
bufferedWriter.write(String.valueOf(ans));
bufferedWriter.newLine();
bufferedReader.close();
bufferedWriter.close();
}
}
我有这个错误:
Solution.java:19: error: cannot find symbol
for (int i = 0; i < arr.length() -2; i++){
^
symbol: method length()
location: variable arr of type List<Long>
Solution.java:20: error: cannot find symbol
for(int j = i + 1; j < arr.length() -1; j++){
^
symbol: method length()
location: variable arr of type List<Long>
Solution.java:21: error: array required, but List<Long> found
if(arr[j] - arr[i] == r){
^
Solution.java:21: error: array required, but List<Long> found
if(arr[j] - arr[i] == r){
^
Solution.java:22: error: cannot find symbol
for(int k = j + 1; k < arr.length(); k++){
^
symbol: method length()
location: variable arr of type List<Long>
Solution.java:23: error: array required, but List<Long> found
if(arr[k] - arr[j] == r){
^
Solution.java:23: error: array required, but List<Long> found
if(arr[k] - arr[j] == r){
^
Solution.java:24: error: array required, but List<Long> found
System.out.println("(" +arr[i] + "," +arr[j] + "," +arr[k] +")");
^
Solution.java:24: error: array required, but List<Long> found
System.out.println("(" +arr[i] + "," +arr[j] + "," +arr[k] +")");
^
Solution.java:24: error: array required, but List<Long> found
System.out.println("(" +arr[i] + "," +arr[j] + "," +arr[k] +")");
^
10 errors
(我从编程开始,所以我不知道代码是否正确)
================================================ =============================
更新:我没有错误,但是每个测试用例返回0。
public class Solution {
// Complete the countTriplets function below.
static long countTriplets(List<Long> arr, long r) {
// Long[] a = arr.toArray();
int counter = 0;
for (int i = 0; i < arr.size() - 2; i++) {
for (int j = i + 1; j < arr.size() - 1; j++) {
if (arr.get(j) - arr.get(i) == r) {
for (int k = j + 1; k < arr.size(); k++) {
if (arr.get(k) - arr.get(j) == r) {
System.out.println("(" + arr.get(i) + "," + arr.get(j) + "," + arr.get(k) + ")");
counter++;
break;
}
}
}
}
}
return counter;
}
}
答案 0 :(得分:2)
变量arr的输入类型是列表,而不是整数数组。 List是Collection的接口。
int [] arr =新的int []; //是使用arr [index]
声明和数组可访问任何元素的方式列表可以包含重复项,并且元素是有序的。 示例实现是LinkedList(基于链接列表)和ArrayList(基于动态数组)。
arr.size()是获取集合大小的函数。另外,为了访问列表中的任何元素,使用了arr.get(index)函数。
答案 1 :(得分:2)
您的问题是您要混淆两个相似但最终是非常不同的概念。
static long countTriplets(List<Long> arr, long r) {
似乎您想将arr
视为数组。因为您以后使用数组访问语法arr[someIndex]
。
但是,您并没有将其声明为 array 。您在那里有一个列表。
然后,您必须使用以下内容:
someList.getSize()
获取列表的 length ,或
someList.get(someIndex)
获取该列表中的特定元素。
但是真正的答案是:当您不了解这些基本的基本知识时,然后从某个地方获取一些代码,然后将其转换为hackerrank,这不是您现在应该做的。
含义:为了成功编写自己的代码,以解决此类问题,您需要已经了解该语言的“足够多”。
因此:退后一步,并获得一本有关Java的好书。并完成那本书。
答案 2 :(得分:1)
您需要更正以下两个错误:
A。使用arr.length
代替arr.length()
B。在arr
循环中使用for
之前,请将其转换为数组。首先,将List<Long> arr
中的countTriplets(List<Long> arr, long r)
参数重命名,例如为List<Long> list
,然后使用以下代码将其转换为Long
数组:
Object []objectArray=list.toArray();
Long arr[] = Arrays.stream(objectArray).map(Object::toString)
.map(Long::valueOf)
.toArray(Long[]::new);