Wyszukanie unikalnej liczby w tablicy

Odpowiedz Nowy wątek
2018-10-10 15:05
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ć?

edytowany 1x, ostatnio: pk_82, 2018-10-10 15:06

Pozostało 580 znaków

2018-10-10 15:16
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.

Na PW przyjmuje tylko (ciekawe!) zlecenia. Masz problem? Pisz na forum, nie do mnie.
edytowany 4x, ostatnio: Shalom, 2018-10-10 15:19

Pozostało 580 znaków

2018-10-10 15:39
0

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

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

Nie jest podane, że pozostałe liczby występują parami/parzyście. - jarekr000000 2018-10-10 15:46
Rzeczywiście, nie jest, w takim razie to nie działa. Jakby ilość powtarzalnych elemntów była parzysta, to tak. - lion137 2018-10-10 15:51
Sprawdź dla [0,1,1,1] ;) - Shalom 2018-10-10 15:52

Pozostało 580 znaków

2018-10-10 20:35
0

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


"Nie popełnia błędów tylko ten, kto nic nie robi"

Pozostało 580 znaków

2018-10-11 15:50
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.

edytowany 1x, ostatnio: pk_82, 2018-10-11 17:26

Pozostało 580 znaków

2018-10-11 15:58
0

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

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


Na PW przyjmuje tylko (ciekawe!) zlecenia. Masz problem? Pisz na forum, nie do mnie.
edytowany 2x, ostatnio: Shalom, 2018-10-11 16:02
if(arr[i-1]==arr[i]) continue; ? - pk_82 2018-10-11 17:30
Słyszałeś o operatorze !=? - Patryk27 2018-10-11 17:44

Pozostało 580 znaków

2018-10-11 17:51
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];
    }

Pozostało 580 znaków

2018-10-11 18:42
V-2
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ć ;).


Nie ma najmniejszego powodu, aby w CV pisać "email" przed swoim adresem mailowym, "imię i nazwisko" przed imieniem i nazwiskiem" ani "zdjęcie mojej głowy od przedniej strony" obok ewentualnego zdjęcia.

Pozostało 580 znaków

2018-10-15 10:54
0
public static double findUniq(double[] arr){
        Arrays.sort(arr);
        return arr[0]<arr[1] ? arr[0] : arr[arr.length-1]; 
     }
Z O(n) zrobiłeś O(n log n). - Patryk27 2018-10-15 10:55
I chyba to nie do końca zaskoczy. - Koziołek 2018-10-15 14:34

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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