2015-08-26 3 views
2

J'essaie de pratiquer des algorithmes avant de commencer mon baccalauréat en informatique et je me bats vraiment mal pour écrire des algorithmes. Je les comprends une fois que je leur ai appris et les démolir mais quand j'essaye de faire le mien, il échoue misérable. J'essaie une question d'exercice dans un manuel de programmation, où j'ai un tableau et je dois sortir la plus grande valeur ou si le tableau est vide, je dois afficher -1.Algorithme de vérification pour afficher la plus grande valeur dans tableau ou affichage si vide

C'était le meilleur que je puisse trouver, mais il est encore trop court. Tout pointeur sur ce que je fais mal.

for(i = 0;i < array.length-1;i++) 
    if(array[i] == 0){ 
     empty = true; 
     n = -1; 
     System.out.println(n); 
    }else{ 
     largest = array[0]; 
     if(array[i] > largest){ 
      largest = array[i]; 
      System.out.println(array[i]); 
     } 
    } 

Je vois que -1 affiché 10 fois, mais je l'ai trouvé aucune solution pour cela et si le tableau est plein, il me donne une alors une valeur.

Répondre

0
if(array.length == 0){ 
    empty = true; 
    n = -1; 
    System.out.println(n); 
}else{ 
    largest = array[0]; 
    for(i = 1; i < array.length; i++) 
     if(array[i] > largest){ 
      largest = array[i]; 
    } 
    System.out.println(largest); 
} 

Tout d'abord, j'ai vérifié que le tableau était vide. Si c'est alors, sautez l'autre et sortez le -1. Si le tableau n'est pas vide, placez le plus grand dans le premier élément, puis passez en boucle dans tous les autres éléments. Remarqué j'ai changé i = 1 car l'élément 0 est déjà le plus grand. Aussi j'ai enlevé le -1 à la longueur de tableau parce que j'arrêterai 1 avant la longueur (qui sera le dernier index de l'élément final). Finalement, j'ai déplacé l'empreinte de la plus grande valeur en dehors de l'instruction if et de la boucle for pour qu'elle ne soit imprimée qu'une seule fois à la toute fin.

0

Vous vérifiez la longueur du tableau dans chaque boucle. Cela signifie qu'il ne sera pas vérifié à moins que le tableau n'ait un objet, ce que nous ne voulons pas. Mais, en fait, vous ne vérifiez pas la longueur du tableau:

if(array[i] == 0) essais si l'élément de tableau à l'index 0 est i. Pour tester la longueur du tableau, vous devez faire if (array.length > 0). Rappelez-vous que vous devez faire ce avant la boucle, donc ce serait quelque chose comme ceci:

if(array[i] == 0){ 
    empty = true; 
    n = -1; 
    System.out.println(n); 
} 
for(i = 0;i < array.length-1;i++) 
    largest = array[0]; 
    if(array[i] > largest){ 
     largest = array[i]; 
     System.out.println(array[i]); 
    } 
} 

Mais, dans chaque boucle vous Réaffectation largest au premier élément de tableau, qui rompt l'algorithme. Vous devez donc déplacer cette ligne avant la boucle for.

if(array[i] == 0){ 
    empty = true; 
    n = -1; 
    System.out.println(n); 
} 
largest = array[0]; 
for(i = 0;i < array.length-1;i++) 
    if(array[i] > largest){ 
     largest = array[i]; 
     System.out.println(array[i]); 
    } 
} 
0

Quelques choses:

if(array[i] == 0) 

ne vérifie pas si le tableau est vide, il vérifie si la valeur stockée à l'index i du tableau est égal à zéro. Vous voulez sans doute quelque chose comme:

if(array != null && array.length == 0) { 
    return -1; 
} 

avant la boucle exécute.

Le reste de votre code est proche. L'instruction d'impression à l'intérieur de la clause else est inutile. Vous avez juste besoin de retourner la valeur de plus grand après l'exécution de la boucle for.

0

Ce code est plutôt étrange en général. Pourquoi considérez-vous un tableau vide dès que vous atteignez un élément 0? Et pourquoi continuez-vous à chercher si le tableau est vide? Dernier point mais non le moindre: pourquoi ignorez-vous le dernier élément du tableau?

Il y a beaucoup de solutions pour ce qui sont beaucoup plus simple:

Sans java-api:

if(array.length == 0) 
    return -1; 

int max = Integer.MIN_VALUE; 
for(int i = 0 ; i < array.length ; i++) 
    if(max < array[i]) 
     max = array[i]; 

return max; 

Une solution paresseuse à l'aide Arrays.sort() (pas tout à fait élégante, mais courte)

Arrays.sort(array); 
return array[array.length - 1]; 

java8 Utilisation:

return Arrays.stream(array).min((a , b) -> new Integer(a).compareTo(b)).orElse(-1); 
0

permet de jeter un oeil à votre code

for(i = 0;i < array.length-1;i++)//You will never reach the last number 
if(array[i] == 0){//Here you check if the first item equals zero. Gives error if there is no first item. 
    empty = true;//why do you need this, you never use it. 
    n = -1; 
    System.out.println(n); 
}else{ 
    largest = array[0];//Why setting largest, do dont know if it is actually bigger 
    if(array[i] > largest){ 
     largest = array[i]; 
     System.out.println(array[i]); 
    } 
} 

Version améliorée:

largest = -1;//set it by default 
for(i = 0;i < array.length;i++)//if length is 10 iMax = 9, which is the tenth item. 
    if(array[i]>largest){//if larger set the new value 
     largest = array[i]; 
    } 
} 
System.out.println(largest);//print the largest number. 
0

Vérifiez d'abord si le tableau est vide

if(array != null && array.length == 0) { 

S'il est imprimé -1

System.out.println(-1 + ""); 
} 

Vous êtes maintenant prêt à parcourir le tableau. Mais avant de créer une variable qui gardera trace de la plus grande valeur. Je l'ai mis au premier élément du tableau (puisque nous savons qu'il a au moins un élément depuis que nous avons déjà déterminé que ce n'est pas vide)

else { 
    int largest = array[0]; 

Ensuite, boucle à travers le réseau

for(i = 0;i < array.length-1;i++) { 

Obtenez tous les éléments un à la fois en utilisant i pour accéder au ième élément

 int current = array[i]; 

comparer ensuite à la plus grande. Si c'est plus grand que le plus grand jusqu'ici, enregistrez-le comme le plus grand.

 if (current>largest) { 
      current = largest; 
     } 

continuer à le faire jusqu'à ce que vous avez terminé en boucle à travers le réseau

} 

Ensuite, imprimez le plus grand

System.out.println(largest + ""); 
} 
1

Si vous êtes aux prises avec des algorithmes, il est parfois utile de ne pas regarder eux comme des algorithmes, mais des problèmes du monde réel.

Dites que vous êtes dans un magasin où vous achetez du fromage et que votre tâche consiste à choisir un paquet de fromage dont la date d'expiration est la plus récente. Maintenant imaginez la situation: debout à la section de fromage à la recherche du meilleur fromage délicieux ...

  1. D'abord, vous regardez s'il y en a. Si non, retournez les mains vides.
  2. S'il y a quelques paquets, passez par eux à la recherche du meilleur. Tu n'as probablement qu'une main libre, tenant le panier dans l'autre, alors ...

    • Dans un premier temps, choisir le premier fromage
    • Ensuite, passer par les paquets un par un. Si vous trouvez du fromage meilleur que celui que vous avez dans votre main, mettez celui que vous tenez et prenez le meilleur.

Maintenant, nous allons mettre à un langage de programmation:

int[] cheeseExpirations = new int[] { ... }; 
if (cheeseExpirations.length == 0) { 
    System.out.println(-1); // no cheese :(
} else { 
    int myCheese = cheeseExpirations[0];     // take the first pack; better a sparrow in the hand than a pigeon on the roof... 
    for (int i = 0; i < cheeseExpirations.length; i++) { // idiomatic array iteration 
     int currentCheese = cheeseExpirations[i]; 
     if (currentCheese > myCheese) {     // found a better one 
      myCheese = currentCheese;     // just take it 
     } 
    } 
    System.out.println(bestCheese); 
} 

Est-il plus clair maintenant? Comme Richard Feynman a dit, en utilisant votre imagination et des exemples est important:

J'ai eu un schéma, que j'utilise encore aujourd'hui quand quelqu'un explique quelque chose que j'essaie de comprendre: je continue à faire des exemples. Par exemple, les mathématiciens viendraient avec un théorème formidable, et ils sont tous excités. Comme ils me disent les conditions du théorème, je construis quelque chose qui correspond à toutes les conditions. Vous savez, vous avez un ensemble (une balle) - disjoint (deux balles). Ensuite, les boules tournent en couleurs, poussent des poils ou quoi que ce soit d'autre dans ma tête alors qu'elles mettent plus de conditions.

Enfin, ils énoncent le théorème, ce qui est une chose stupide à propos de la balle qui n'est pas vrai pour ma chose de balle verte poilue, alors je dis "Faux!" [et] signaler mon contre-exemple.