Je fais un défi de code où, étant donné deux nombres entiers l
et r
, je dois imprimer tous les nombres impairs entre i
et r
(i
et r
inclus). La fonction doit renvoyer un tableau d'entiers indiquant les nombres impairs entre l
et r
.
C'est ce que j'ai jusqu'ici
static int[] oddNumbers(int l, int r) {
int[] theArray = new int[r];
for (int i = l; i < theArray.length; i++) {
if (i % 2 != 0) {
for (int n = 0; n < theArray.length; n++) {
theArray[n] = i;
}
}
}
return theArray;
}
Donc, pour le moment, ce code, si vous lui attribuez les valeurs 2 et 5, devrait renvoyer 3,5. Toutefois, cela ne renvoie que 33333. Qu'est-ce que je fais de travers? Et comment puis-je améliorer ce code?
J'aborderais ceci en avançant la limite inférieure dans l'intervalle jusqu'au prochain nombre impair, si pas déjà impair, puis en procédant de là.
static int[] oddNumbers(int l, int r) {
if (r <= l) return null;
l = (l % 2) == 0 ? l + 1 : l;
int size = ((r - l) / 2) + 1;
int[] theArray = new int[size];
for (int i=0; i < size; ++i) {
theArray[i] = l + (i*2);
}
return theArray;
}
La vraie difficulté ici consiste à formuler la logique pour mapper une plage de nombres impairs sur un tableau plat. Une fois que nous avons fait cela, nous pouvons voir que le remplissage du tableau ne nécessite qu'une simple boucle for.
Nous sommes en 2018 et avons déjà l'incroyable Streams
depuis Java 8! Avec cela, vous pouvez résoudre de telles choses en une seule ligne! Donc, ça vaut le coup de jeter un coup d'oeil:
static int[] oddNumbers(int i, int j){
return IntStream.rangeClosed(i, j).filter(num -> num % 2 == 1).toArray();
}
(sauf si vous voulez vraiment apprendre des algorithmes et pas seulement résoudre le défi!)
Je déléguerais le travail à un flux ou une liste permettant de gérer facilement et dynamiquement la taille d'une sélection.
Pourquoi devrions-nous nous préoccuper de la taille d'un tableau résultant si nous pouvions effectuer une simple transformation à partir d'une structure appropriée à la fin?
static int[] oddNumbers(int l, int r) {
return IntStream.iterate(l, i -> i <= r, i -> ++i)
.filter(i -> i % 2 != 0)
.toArray();
}
static int[] oddNumbers(int l, int r) {
int[] theArray = new int[((r - l) / 2) + 1];
for (int i = l % 2 == 0 ? l : l + 1, j = 0; i <= r; i += 2, j++)
theArray[j] = i;
return theArray;
}