【问题标题】:The output is not getting convert into into long data type输出未转换为长数据类型
【发布时间】:2020-12-18 16:08:23
【问题描述】:

问题来自:https://www.hackerrank.com/challenges/mini-max-sum/problem

问题描述:给定五个正整数,找出可以通过将五个整数中的四个恰好相加来计算的最小值和最大值。然后将各自的最小值和最大值打印为一行,由两个空格分隔的长整数组成。

问题:对于某些测试用例,我得到了输出 -ve,我理解这是因为“int”大小的存储是有限的,这就是我得到 -ve 值的原因。 我不明白我在哪里犯了错误。

我的解决方案:

static void miniMaxSum(int[] arr) {
        int n = arr.length;
        long[] ar = new long[n];

        ar[0] = arr[1] + arr[2] + arr[3] + arr[4];
        ar[1] = arr[0] + arr[2] + arr[3] + arr[4];
        ar[2] = arr[0] + arr[1] + arr[3] + arr[4];
        ar[3] = arr[0] + arr[1] + arr[2] + arr[4];
        ar[4] = arr[0] + arr[1] + arr[2] + arr[3];

        long[] a = new long[n];
        for(int i=0; i<n; i++){
            a[i]=ar[i];
        }
        Arrays.sort(a);

        long max =a[4];
        long min =a[0];
        
        System.out.print(min+" "+max);
    }

HackerRank 提供的预先编写的代码:

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();
    }
}

【问题讨论】:

    标签: java integer long-integer


    【解决方案1】:

    首先,您应该在解决问题时编写通用代码,以便它可以针对该问题执行各种测试用例。例如。如果数组大小更大怎么办?

    而且我还看到,在您的问题的一些答案中,他们首先对数组进行了排序,从而使代码变慢。在这种情况下,您永远不需要排序。

    这里是解决方案,在O(n)内解决问题,速度更快

    static void minMaxSum(int[] arr) {
            
        int min = arr[0];
        int max = arr[0];
        long totalSum = arr[0];
    
        for (int i = 1; i < arr.length; i++) {
            if (min > arr[i]) {
                min = arr[i];
            } else if (max < arr[i]) {
                max = arr[i];
            }
            totalSum += arr[i];
        }
        
        long minSum = totalSum - max;
        long maxSum = totalSum - min;
        
        System.out.println(minSum + " " + maxSum);
    }
    

    现在回到你原来的问题,为什么 int 数据没有转换成 long。

    发生这种情况是因为当您在 C、C++、Java 或 C# 等语言中添加多个整数时,计算的结果将始终是整数,因为所有操作数都是整数。由于结果是一个整数,它计算了一个 -ve 整数值,然后将其赋值为长整数。这么久没有收到原值。

    要将加法解释为 long,您应该对四个操作数之一执行显式类型转换。 看,int + int => int 但是,long + int => long

    所以你应该写,(将第一个操作数转换为 long)

    ar[0] = (long)arr[1] + arr[2] + arr[3] + arr[4]
    

    这将给出正确的结果。

    【讨论】:

    • 你是对的,我倾向于只编写通用代码,但在问题陈述本身中,他们只给出了 5 个元素,这就是我对这些元素进行硬编码的原因。无论如何,感谢它提供了很大帮助的解决方案。
    【解决方案2】:

    始终以通用方式编写代码,您对所有内容都进行了硬编码(固定 5 个元素)。

    使用以下解决方案,它将通过所有测试用例:

    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);
    }
    

    【讨论】:

      【解决方案3】:

      输出没有问题,已经在long。但是,您的逻辑毫无意义,您创建了 5 个数组ar,每个数组的总和都不同。 for 循环将 ar[4] 存储在 a[i] 中。对单个元素进行排序,maxmin 分配了任意值。
      你只需要对数组进行升序排序,找到前4个元素和后4个元素的总和并显示出来。

      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);
      }
      

      【讨论】:

      • 你的很短我喜欢它,但你的代码也不会提供确切的答案,因为你错过了类型转换。应该是这样 -> long sum1 = (long)arr[0] + arr[1] + arr[2] + arr[3];
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-31
      • 1970-01-01
      • 1970-01-01
      • 2020-11-22
      • 2019-07-15
      • 1970-01-01
      相关资源
      最近更新 更多