Java > Array-2> zeroMax
Mon code ne manque que 5 cas et je ne sais pas pourquoi, quelqu'un m'aide.
Problème
Renvoie une version du tableau donné où chaque valeur nulle dans le tableau est remplacé par la plus grande valeur impaire à droite du zéro dans la tableau. S'il n'y a pas de valeur impaire à droite du zéro, laissez le zéro zéro.
ZeroMax({0, 5, 0, 3}) → {5, 5, 3, 3}
ZeroMax({0, 4, 0, 3}) → {3, 4, 3, 3}
ZeroMax({0, 1, 0}) → {1, 1, 0}
Mon code
public int[] zeroMax(int[] nums) {
int acum = 0;
int i = 0;
for( i = 0; i < nums.length;i++){
if(nums[i]==0){
for(int j = i; j < nums.length;j++){
if (nums[j]%2!=0){
acum = nums[j];
break;
}
}
nums[i]=acum;
}
}
return nums;
}
7 answers
Ce qui vous manque, c'est qu'il pourrait y avoir plus d'un nombre impair sur le côté droit de votre zéro et vous devez choisir le plus grand.
Edit: Et vous avez aussi besoin de réinitialiser 'téléphone'. J'ai mis à jour ma suggestion:)
Voici une suggestion:
public int[] zeroMax(int[] nums) {
int acum = 0;
int i = 0;
for (i = 0; i < nums.length; i++) {
if (nums[i] == 0) {
for (int j = i; j < nums.length; j++) {
if (nums[j] % 2 != 0 && nums[j] > acum) {
acum = nums[j];
}
}
nums[i] = acum;
acum = 0;
}
}
return nums;
}
Cela peut être fait beaucoup plus efficacement en réorganisant un peu le problème.
Au lieu de parcourir de gauche à droite, puis de scanner les entiers à droite pour le remplacement, vous pouvez simplement aller de droite à gauche. Ensuite, vous pouvez stocker le remplacement précédent jusqu'à ce que vous rencontriez un nombre impair plus grand.
public int[] zeroMax(final int[] nums) {
int replace = 0; // Stores previous largest odd - default to 0 to avoid replacement
for (int i = nums.length - 1; i >= 0; i--) { // start from end
final int next = nums[i];
if (next == 0) { // If we should replace
nums[i] = replace;
} else if (next % 2 == 1 && next > replace) {
// If we have an odd number that is larger than the replacement
replace = next;
}
}
return nums;
}
Compte tenu de vos exemples, cette sortie:
[5, 5, 3, 3]
[3, 4, 3, 3]
[1, 1, 0]
Le problème de base est que cet algorithme ne recherche pas la plus grande valeurimpaire, mais pour la première valeur impaire dans le tableau, c'est-à-dire à droite d'une valeur donnée. En dehors de cela, vous pouvez envisager de créer une table pour la plus grande valeur impaire pour tous les indices afin de simplifier votre code.
public int[] zeroMax(int[] nums) {
for (int i = 0; i < nums.length - 1; i++) {
if (nums[i] == 0) {
int max = 0;
for (int j = i + 1; j < nums.length; j++) {
if (nums[j] % 2 != 0 && nums[j] > max) {
max = nums[j];
}
}
nums[i] = max;
max = 0;
}
}
return nums;
}
public int[] zeroMax(int[] nums) {
int val = 0;
for(int i = 0; i < nums.length; i++) {
if(nums[i] == 0) {
for(int j = i + 1; j < nums.length; j++) {
if(val <= nums[j]) {
if(nums[j] % 2 == 1) {
val = nums[j];
}
}
}
nums[i] = val;
val = 0;
}
}
return nums;
}
public int[] zeroMax(int[] nums) {
int[] result = nums.clone();
for (int i = nums.length - 1, max = 0; i >= 0; i--)
if (isOdd(nums[i])) max = Math.max(nums[i], max);
else if (nums[i] == 0) result[i] = max;
return result;
}
boolean isOdd(int num) { return (num & 1) == 1; }
Nous itérons en arrière, en stockant toujours le plus grand nombre impair rencontré (ou 0
, si aucun n'a été trouvé) dans max
.
Lorsque nous trouvons un 0
, nous le remplaçons simplement par max
.
L'entrée est intacte pour éviter de ruiner l'entrée de quelqu'un d'autre.
Voici le code qui fonctionne pour chaque entrée. Essayez ceci sur votreE
public int[] m1(int a[]){
int j = 0;
for (int i = 0; i < a.length; i++) {
if(a[i]!=0){
continue;
}
else if(a[i]==0){
j=i;
while(j<a.length){
if(a[j] % 2 != 0){
if(a[i]<=a[j]){
a[i] = a[j];
j++;
}
else{
j++;
continue;
}
}
else{
j++;
continue;
}
}
}
}
return a;
}