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
Dark_Foxx 19 listopad 2019, 14:16
Zmienna arr jest instancją List, spróbuj użyć arr.size() zamiast arr.lenght()
 – 
Sergio Arrighi
19 listopad 2019, 14:21
Po co używać size() zamiast length()?
 – 
Dark_Foxx
19 listopad 2019, 14:24
Ponieważ lenght() jest metodą typu Array, podczas gdy twój parametr jest typu List. size() jest tym samym co length tylko dla obiektów List. Błąd wynika z faktu, że dla obiektu typu List nie istnieje długość metody. Spróbuj size() ;)
 – 
Sergio Arrighi
19 listopad 2019, 14:25
Nie używaj także arr[k], ale użyj arr.get(k) z tego samego powodu, co powyżej ;)
 – 
Sergio Arrighi
19 listopad 2019, 14:32
Działa, ale teraz daj mi wynik 0 dla każdego przypadku testowego
 – 
Dark_Foxx
19 listopad 2019, 14:41

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).

2
Meghna 19 listopad 2019, 14:29

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ę.

2
GhostCat 19 listopad 2019, 14:33
Ja zrobiłem Javę ale jestem trochę zardzewiały, ale zgadzam się z Tobą w ostatnim punkcie. Postąpiłbym zgodnie z twoją radą, ale w sieci jest wiele "wskazówek" i nie wiedziałbym, co wybrać.
 – 
Dark_Foxx
19 listopad 2019, 14:56
Widzę, że przegłosowałeś kilka odpowiedzi. Czy jest jakiś konkretny powód, dla którego nie przyjąłeś odpowiedzi? Czegoś ci brakuje?
 – 
GhostCat
20 listopad 2019, 10:45
Nie przyjąłem żadnej odpowiedzi, bo nie wiem, którą wybrać. Również nadal mam problem, że moja funkcja wraca do 0
 – 
Dark_Foxx
20 listopad 2019, 11:29

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);
1
Arvind Kumar Avinash 19 listopad 2019, 14:44
Przechodząc do tablicy, powinieneś zejść w dół o pełne dziewięć jardów ... i mieć na końcu tablicę long ;-)
 – 
GhostCat
19 listopad 2019, 15:10