0
votes

La sortie ne se convertit pas en type de données long

Le problème est de: https://www.hackerrank.com/ Défis / Mini-Max-Somme / Problème

Problème Description: Cinq entiers positifs, trouvez les valeurs minimales et maximales pouvant être calculées en additionnant quatre des cinq entiers. Ensuite, imprimez les valeurs minimales et maximales respectives comme une seule ligne de deux entiers longs séparés par l'espace. P>

problème: à certains des cas de test, je reçois la sortie -ve, que j'ai compris que c'est à cause de là est limite au stockage de la taille "int", c'est pourquoi je reçois les valeurs -ve. Je ne comprends pas où je fais l'erreur. P>

Ma solution: P>

import java.io.*;
import java.math.*;
import java.security.*;
import java.text.*;
import java.util.*;
import java.util.concurrent.*;
import java.util.regex.*;

public class Solution {

    // Complete the miniMaxSum function below.
    static void miniMaxSum(int[] arr) {
        
    }

    private static final Scanner scanner = new Scanner(System.in);

    public static void main(String[] args) {
        int[] arr = new int[5];

        String[] arrItems = scanner.nextLine().split(" ");
        scanner.skip("(\r\n|[\n\r\u2028\u2029\u0085])?");

        for (int i = 0; i < 5; i++) {
            int arrItem = Integer.parseInt(arrItems[i]);
            arr[i] = arrItem;
        }

        miniMaxSum(arr);

        scanner.close();
    }
}


0 commentaires

3 Réponses :


0
votes

Toujours d'écriture de code de manière générique, tout codé dur (fixe 5 éléments).

Utilisez la solution ci-dessous, il passera tous vos cas de test: P>

static void miniMaxSum(int[] arr) {

  int n =arr.length;
  Arrays.sort(arr);
  long min = 0;
  long max = 0;
    
  for(int i = 0; i <= n - 2; i++){
        min += arr[i];
  }
  for (int i = 1; i <= n - 1; i++){
        max += arr[i];
  }

  System.out.println(min + " " + max);
}


0 commentaires

0
votes

Il n'y a pas de problème dans la sortie, il est déjà dans long code>. Cependant, votre logique n'a aucun sens que vous avez créé 5 tableaux ar code> chacun ayant une somme différente. Le pour code> boucles ar [4] code> dans a [i] code>. Le tri est effectué sur un seul élément et max code> et min code> ont des valeurs arbitraires attribuées.
Il vous suffit de trier la matrice dans l'ordre croissant, de trouver la somme des premier et du dernier 4 éléments et de les afficher.

static void miniMaxSum(int[] arr) 
{
    long sum1 = 0, sum2 = 0;

    Arrays.sort(arr);             //Ascending Sort
    for (int i = 0; i < 4; i++) 
        sum1 +=  arr[i];          //First 4 sum

    for (int j = arr.length - 1; j > 0; j--) 
        sum2 +=  arr[j];          //Last 4 sum

    System.out.println(sum1 + " " + sum2);
}


1 commentaires

Votre message est court que je l'ai aimé, mais votre code ne va pas non plus fournir la réponse exacte, car vous avez manqué la coulée de type. Il devrait être comme ça -> Long Sum1 = (long) Arr [0] + arr [1] + arr [2] + arr [3];



1
votes

Tout d'abord, vous devriez écrire un code générique tout en résolvant un problème afin de pouvoir effectuer toutes sortes de cas de test pour le problème. Par exemple. Et si la taille de la matrice est plus?

et j'ai également vu, dans certaines réponses à votre question, ils ont d'abord triché le tableau, ce qui rend le code lent. Vous n'avez jamais besoin de tri dans ce cas.

Voici la solution, qui résout le problème dans O (n) et est plus rapide xxx "maintenant Votre question originale que la raison pour laquelle les données INT ne convergent pas de long.

Ceci se produit parce que lorsque vous ajoutez plusieurs entiers dans des langues telles que C, C ++, Java ou C #, le résultat calculé sera toujours un entier, puisque tous les opérandes étaient des entiers. Et puisque le résultat est un entier, il a calculé une valeur entière de -ve, puis l'affectée longtemps. Si longtemps n'a pas reçu la valeur d'origine.

Pour interpréter l'addition aussi longtemps, vous devez effectuer une coulée de type explicite sur l'un des quatre opérandes. Voir, int + int => int Mais, long + int => long

Vous devriez donc écrire (casting premier opérande à long) xxx

et cela donnera un résultat correct. < / p>


1 commentaires

Vous êtes correct, j'ai tendance à écrire uniquement du code générique, mais dans la déclaration problématique elle-même, ils n'ont donné que 5 éléments, c'est pourquoi j'ai un codé dur les éléments. Quoi qu'il en soit, merci pour la solution, cela a beaucoup aidé.