Ciągle otrzymuję wyjątek IndexOutOFBoundsException i nie mogę znaleźć miejsca. Spędziłem całe wieki, próbując to rozgryźć. Każda pomoc będzie mile widziana. Dzięki

class Solution {

public List<Integer> findDisappearedNumbers(int[] nums) {

    if(nums.length < 2){
        return new ArrayList<Integer>();
    }

    List<Integer> ret = new ArrayList<Integer>(nums.length);

    for(int i=0; i < nums.length; i++){
        ret.set(i,i);
    }

    for(int i=0; i < nums.length; i++){            
        ret.set(nums[i]-1, nums[i]);
    }     

    for(int i=0; i < nums.length; i++){ 
        if(ret.get(i) == 0){
            ret.set(i, i+1);
        }
        else{
            ret.remove(i);
        }
    }
    return ret;       
}

}

-2
D-odu 31 marzec 2020, 23:32

4 odpowiedzi

Najlepsza odpowiedź
for(int i=0; i < nums.length; i++){            
    ret.set(nums[i]-1, nums[i]);
}     

Tam ustawiasz indeks nums[i]-1 na nums[i], ale spowoduje to zgłoszenie błędu, jeśli nums[i] jest mniejsze lub równe 0 lub większe niż długość.

Jako inna odpowiedź z @ Bahij.Mik (pamiętaj o głosowaniu za nim), w tym momencie na liście nie ma żadnych elementów.

Możesz tutaj użyć add() zamiast set().

Zwróć uwagę, że new ArrayList<>(number) utworzy nowy ArrayList z początkowym spacją na n elementy, nie wypełni elementów tak, jak w przypadku tablicy (nie nawet z null)

Także w

for(int i=0; i < nums.length; i++){ 
    if(ret.get(i) == 0){
        ret.set(i, i+1);
    }
    else{
        ret.remove(i);
    }
}

Usuwasz elementy podczas iteracji po ArrayList.

Zmniejszy to rozmiar ArrayList i wyjdziesz poza granice, jeśli w którymś momencie usuniesz element.

1
dan1st 31 marzec 2020, 21:03

Jak wspomniałem w komentarzach, problem staje się znacznie łatwiejszy, jeśli sortujesz nums. Następnie możesz sprawdzić, czy aktualna wartość jest równa poprzedniej wartości. A także, że aktualna wartość (jeśli jest inna) różni się o jeden. Lubić,

public List<Integer> findDisappearedNumbers(int[] nums) {
    List<Integer> al = new ArrayList<>();
    if (nums == null || nums.length < 2) {
        return al;
    }
    Arrays.sort(nums);
    for (int i = 1; i < nums.length; i++) {
        int v = nums[i] - 1, prev = nums[i - 1];
        if (nums[i] != prev && v != prev) {
            al.add(v);
        }
    }
    return al;
}
0
Elliott Frisch 31 marzec 2020, 21:00

Oto rozwiązanie

class Solution {

public List<Integer> findDisappearedNumbers(int[] nums) {

    List<Integer> ret = new ArrayList<>();

    for(int i = 0; i < nums.length; i++){
        int index = Math.abs(nums[i]) - 1;
        if(nums[index] > 0 ){
            nums[index] *= -1;
        }
    }

    for(int j = 1; j <= nums.length; j++){
        if(nums[j-1] > 0 ){
            ret.add(j);
        }
    }
    return ret;

}

}

0
D-odu 31 marzec 2020, 21:40

W kodzie występuje kilka problemów. Pierwszą rzeczą, która rzuca się w oczy, jest to, że podczas tworzenia instancji listy arraylistycznej z

List<Integer> ret = new ArrayList<Integer>(nums.length);

Po prostu ustawiasz początkową pojemność listy, a nie rozmiar, więc nie możesz ustawić elementów w określonych indeksach, zamiast tego musisz dodać elementy do listy, a następnie możesz je zmodyfikować we wspomnianych indeksach, więc zamiast ret.set(i, i) użyj ret.add(i).

1
Bahij.Mik 31 marzec 2020, 20:43