Wyszukanie unikalnej liczby w tablicy

0

Mam problem z poprawnym określeniem warunków aby wyszukać unikalną liczbę w tablicy.
Przyjmujemy, że rozmiar tablicy jest >= 3 oraz jedna liczba jest unikalna pozostałe są takie same np.: new double[]{ 1, 2, 2, 2, 2 }
Brakuje mi warunku, gdy unikalna jest ostatnia: { 2, 2, 2, 2, 1 }

public static double findUniq(double arr[]) {
        double uniq = 0.0;
        uniq = arr[0];
        for(int i=0; i<arr.length; i++){
            //uniq = arr[i];
            for(int j=i+1; j<arr.length-1; j++){
                if(uniq!=arr[j]){
                
                    if(arr[j]!=arr[j+1]){
                        uniq = arr[j];
                        break;
                    }
                }
            }
        }
        return uniq;
    }

Nie szukam konkretnej odpowiedzi lecz jakiejś podpowiedzi jak to zrobić a może macie jakiś inny sposób jak to zrobić?

4
  1. Bierzesz pierwsze 2 liczby
  2. Porównujesz ze sobą 2 pierwsze liczby. Jeśli są równe, to iterujesz po reszcie tablicy szukając innej liczby
  3. Jeśli liczby są od siebie różne, to sprawdzasz czy pierwsza z nich jest równa trzeciej. Jeśli jest to wynikiem jest druga. Jeśli nie jest, to wynikiem jest pierwsza.
    Optymistycznie O(1), pesymistycznie O(n). Twój kod to jakis hardkor z O(n^2). Chyba wszystko byłoby od tego lepsze. Nawet "zliczanie" w mapie int->int.
0

A to nie jest klasyczny przykład na użycie XOR?
Python

import operator as op
reduce(op.xor, number_array)
0

Kolega chyba chce żeby mu katę z code wars rozwiązać :)

0

Mam rozwiązanie:

public static double findUniq(double arr[]) {
        
        for(int i=1; i<arr.length-1; i++){
            if(arr[i-1]==arr[i]) continue;
            else{
                if(arr[i-1]==arr[i+1]) return arr[i];
                else return arr[i-1];
            }
        }
        return arr[arr.length-1];
    }

@Shalom Masz rację, pierwotna wersja to rzeczywiście hardkor.

0

if(arr[i-1]==arr[i]);

aaaaa. Toś rozwiązał :D Wygrywasz nagrodę za najmniej czytelne rozwiązanie tygodnia.

0
public static double findUniq(double arr[]) {

        for(int i=1; i<arr.length-1; i++){
            if(arr[i-1]!=arr[i]){
                if(arr[i-1]==arr[i+1]) return arr[i];
                else return arr[i-1];
            }
        }
        return arr[arr.length-1];
    }
0

Nie jest to najważniejsze, ale else po continue albo po return jest najzupełniej zbędne i zawsze skłania mnie do podejrzenia, że autor nie jest na 100% pewien, jak działa continue i woli się zabezpieczyć ;).

0
public static double findUniq(double[] arr){
        Arrays.sort(arr);
        return arr[0]<arr[1] ? arr[0] : arr[arr.length-1]; 
     }

1 użytkowników online, w tym zalogowanych: 0, gości: 1