[HackerRank][C#] Mini-Max Sum Solution

分享

一個程式新手透過Hackrank練習程式的過程紀錄,會用自己能夠理解的白話語言來解釋,有錯誤的話請多多包涵也不吝給予指教。

問題描述

給出五個正整數,找出其中四個數字相加後的最小值與最大值為何。

範例

arr = [1,3,5,7,9]

minisum = 1+3+5+7 = 16
maxsum = 3+5+7+9 = 24

輸出入格式

input

1 2 3 4 5

output

10 14

Solution 1

最直覺的作法就是先全部相加,分別扣掉最小跟最大,那答案就出來囉。

第一次直接解題的思維如下:
1. 運用 Max()跟Min() 找出 List int 裡最大與最小的數字。
2.迴圈相加後再分別扣掉輸出即可

    /*
     * Complete the 'miniMaxSum' function below.
     *
     * The function accepts INTEGER_ARRAY arr as parameter.
     */

    public static void miniMaxSum(List<int> arr)
    {
        int maxValue = arr.Max();
        int minValue = arr.Min();
        int result = 0;
        
        for(int i=0;i<arr.Count();i++){
            result += arr[i];
        }
        
        Console.WriteLine($"{result - maxValue} {result - minValue}");
    }

結果這樣的結果submit後會換來 10/15 test cases failed 🙁

原因是因為題目中有提醒 Hints: Beware of integer overflow! Use 64-bit Integer.,所以必須通通改成 long 才合適。

    /*
     * Complete the 'miniMaxSum' function below.
     *
     * The function accepts INTEGER_ARRAY arr as parameter.
     */

    public static void miniMaxSum(List<int> arr)
    {
        long maxValue = arr.Max();
        long minValue = arr.Min();
        long result = 0;
        
        for(int i=0;i<arr.Count();i++){
            result += arr[i];
        }
        
        Console.WriteLine($"{result - maxValue} {result - minValue}");
    }

解題關鍵

  1. 知道int跟long的範圍,避免overflow的問題。
int是帶正負號的 32 位元整數,範圍是
-2,147,483,648 至 2,147,483,647

long是帶正負號的 64 位元整數,範圍是
-9,223,372,036,854,775,808 至 9,223,372,036,854,775,807
  1. 輸出的格式為兩個數字中間隔一個空白,所以要稍微知道Console.WriteLine的使用方式,運用 $ – string interpolation
Console.WriteLine($"{result - maxValue} {result - minValue}");
  1. List計算有幾個元素是使用Count()

參考資料

  1. $ – string interpolation (C# reference)
分享
Scroll to Top