Find the Unique, my precious

Cette semaine, c'est Quentin qui vous propose un #KataOfTheWeek : Find the Unique

Briefing du Kata : En vous donnant un tableau composé uniquement de nombres, tous égaux sauf 1. Trouvez-le…

Kata.findUniq(new double[]{ 1, 1, 1, 2, 1, 1 }); // => 2
Kata.findUniq(new double[]{ 0, 0, 0.55, 0, 0 }); // => 0.55

Le tableau contient au moins 3 nombres.

Saurez-vous résoudre le problème ?

Bon courage !


Et voici des solutions proposées par l'auteur en Java :

Une première solution :

import java.util.Arrays;
 public class Kata {
    public static double findUniq(double[] arr) {
      Arrays.sort(arr);
      return arr[0] == arr[1] ? arr[arr.length-1]:arr[0];
    }
}

Solution plutôt simple, le tableau contenant que 2 nombres différents (en plusieurs exemplaires) en le triant on s'assure que le nombre unique est soit au début soit à la fin du tableau.

Après si vous êtes en train de réviser l'OCP et que vous voulez utiliser les streams, vous pouvez collecter le tableau après l'avoir converti en Double, une fois converti on peut collecter le stream dans une Map avec un goupingBy :

import java.util.*;
import java.util.stream.Collectors;
import java.util.function.Function;

 public class Kata {
    public static double findUniq(double arr[]) {
      return Arrays.stream(arr)
                .boxed()
                .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
                .entrySet().stream()
                .filter(e-> e.getValue() == 1)
                .map(Map.Entry::getKey)
                .findFirst()
                .get();
    }
}

Mais cette solution est moins optimisée.

Votre équipe TakiVeille