Robię to ćwiczenie na HackerRank:
Otrzymujesz tablicę i musisz znaleźć liczbę trójek indeksów (i, j, k) takich, że elementy w tych indeksach są w postępie geometrycznym dla danego wspólnego stosunku r i i
Pełne ćwiczenie: https://www.hackerrank.com/challenges/count-triplets -1/problem Mam problemy z kompilatorem. To jest kod:
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();
}
}
Mam to błędy:
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
(Zaczynam od programowania, więc nie wiem, czy kod jest poprawny)
========================================================. ===========================.
AKTUALIZACJA: Nie mam błędów, ale zwracam 0 dla każdego przypadku testowego.
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;
}
}
3 odpowiedzi
Typ danych wejściowych dla zmiennej arr to lista, a nie tablica liczb całkowitych. Lista jest interfejsem Collection.
Int [] arr = new int []; // to sposób na zadeklarowanie i umieszczenie w tablicy dowolnego elementu, do którego można uzyskać dostęp za pomocą funkcji arr [indeks]
Lista może zawierać duplikaty, a elementy są uporządkowane. Przykładowe implementacje to LinkedList (oparta na liście połączonej) i ArrayList (oparta na tablicy dynamicznej).
Arr.size () to funkcja pozwalająca uzyskać rozmiar kolekcji. Ponadto, aby uzyskać dostęp do dowolnego elementu listy, używana jest funkcja arr.get (indeks).
Twoim problemem jest to, że mieszasz dwa podobne, ale na końcu: bardzo różne koncepcje.
static long countTriplets(List<Long> arr, long r) {
Wygląda na to, że chcesz myśleć o arr
jako o tablicy . Ponieważ później używasz składni dostępu do tablicy arr[someIndex]
.
Ale cóż, nie zadeklarowałeś tego jako tablicę . Masz tam listę .
Następnie musisz użyć takich rzeczy, jak:
someList.getSize()
Aby uzyskać długość listy lub
someList.get(someIndex)
Aby uzyskać określony element z tej listy.
Ale prawdziwa odpowiedź brzmi: kiedy nie rozumiesz tak podstawowych rzeczy, to pobieranie skądś kodu, aby zmienić go w hackerrank, nie jest tym, co powinieneś teraz robić.
Znaczenie: aby z powodzeniem napisać własny kod, aby rozwiązać takie ćwiczenia, trzeba już „dość” rozumieć język.
Zatem: cofnij się i zdobądź dobrą książkę o Javie. I przejrzyj tę książkę.
Musisz poprawić kilka następujących błędów:
A. Użyj arr.length
zamiast arr.length()
B. Konwertuj arr
na tablicę, zanim użyjesz jej w pętlach for
. Najpierw zmień nazwę parametru List<Long> arr
w countTriplets(List<Long> arr, long r)
, np. jako List<Long> list
, a następnie użyj następującego kodu, aby przekształcić go w tablicę Long
:
Object []objectArray=list.toArray();
Long arr[] = Arrays.stream(objectArray).map(Object::toString)
.map(Long::valueOf)
.toArray(Long[]::new);
Podobne pytania
Nowe pytania
java
Java to język programowania wysokiego poziomu. Użyj tego tagu, jeśli masz problemy z używaniem lub zrozumieniem samego języka. Ten tag jest rzadko używany samodzielnie i jest najczęściej używany w połączeniu z [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] i [maven].