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;
}
Author: Carlos Muñoz, 2015-06-16

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;
}
 1
Author: rlsw, 2015-06-15 23:19:06

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]
 2
Author: Obicere, 2015-06-16 00:05:13

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.

 0
Author: Paul, 2015-06-15 22:56:21
    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;

}
 -1
Author: muradul mostafa, 2016-08-22 14:09:09
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;
}
 -1
Author: James, 2016-09-19 02:35:22
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.

 -1
Author: Lőrinc Pap, 2017-02-05 10:44:26

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;
}
 -2
Author: Yashaswi Mehta, 2016-07-19 01:23:45