【问题标题】:Ruby - Hacker Rank issueRuby - 黑客等级问题
【发布时间】:2021-11-15 06:47:55
【问题描述】:

**

好的,伙计们,我对 Hacker Rank 中的任务有疑问。 我无法通过所有测试。


**

任务:

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

功能说明

在下面的编辑器中完成 miniMaxSum 函数。

miniMaxSum 有以下参数:

arr: 5 个整数的数组

打印

在一行上打印两个以空格分隔的整数:5 个元素中 4 个的最小和和最大和。

输入格式

一行五个用空格分隔的整数。

**这是任务和我的代码:**


require 'json'
require 'stringio'

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

def miniMaxSum(arr)
   if arr[0] != arr[1]
     $prev = 0 
     $prev2 = Float::INFINITY
     i = 0
     5.times do
       $res = arr.reject { |n| n == arr[i] }.sum
       $prev = $res if $res > $prev
       i = i + 1
      end
      i = 0
     5.times do
       $res2 = arr.reject { |n| n == arr[i] }.sum
       $prev2 = $res2 if $res < $prev2
       i = i + 1
      end
     print "#{$prev2} #{$prev}"
    else
        print "#{arr.sum} #{arr.sum}"
    end
      
end

arr = gets.rstrip.split.map(&:to_i)

miniMaxSum arr

请帮忙。

【问题讨论】:

  • 将所有 5 个整数相加一次,然后从总和中减去每个整数。
  • “我无法通过所有测试” – 请展示测试,并显示您通过了哪些测试,哪些未通过,并包含 precise 错误消息。

标签: arrays ruby loops


【解决方案1】:

将数组中最小的 4 个元素和最大的 4 个元素相加还不够吗?

您的问题在输入中有点不清楚,因此我提供两个答案。

当输入是一个5个整数的数组

def min_max_sum(array)
  sorted = array.sort
  puts "#{sorted.first(4).sum}  #{sorted.last(4).sum}"
end

min_max_sum [5, 4, 3, 2, 1]
#=> 10  14

当输入格式为一行五个空格分隔的整数时

def min_max_sum(string)
  sorted = string.split(/ /).map(&:to_i).sort
  puts "#{sorted.first(4).sum}  #{sorted.last(4).sum}"
end

min_max_sum "5 4 3 2 1"
#=> 10  14

【讨论】:

    【解决方案2】:

    我们可以观察到,5 个元素中的 4 个之和就是所有 5 个元素的总和减去其中一个元素。如果我们有[1,2,3,4,5],总和是 15,我们可以通过从中减去每个得到部分总和。 15 - 1 是 14,15 - 2 是 13,依此类推。

    然后我们可以在一个循环中找到最小值和最大值。

    在算法上比对最大和最小数字进行排序和求和更有效。该算法只需遍历列表两次。它运行 2n 次,或 O(n)。排序需要 O(nlogn) 加上两次迭代才能求和。这对于 5 个数字无关紧要,但随着大小变大,这一点非常重要。

    Time Complexity

    def min_max_sum(nums)
      # Take the sum of every number.
      sum = nums.sum
    
      # Ye olde min/max trick.
      # Set min to something everything will be smaller than.
      # Set max to something everything will be larger than.
      min = Float::INFINITY
      max = -Float::INFINITY
      
      # For each number...
      nums.each do |num|
        # Get the sum for 4 of 5 values by subtracting this number from the sum.
        partial_sum = sum - num
        
        # Check if it's the min and/or the max.
        min = partial_sum if partial_sum < min
        max = partial_sum if partial_sum > max
      end
      
      return [min, max]
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-04
      • 2021-02-24
      • 1970-01-01
      • 2022-07-29
      • 1970-01-01
      • 2019-11-03
      • 1970-01-01
      相关资源
      最近更新 更多