***
好吧,伙計們,我在Hacker Rank的一個任務上遇到了問題。 我不能通過所有的測驗。
***
任務:
給定五個正整數,找出可以通過對五個整數中的四個整數相加計算出來的最小值和最大值。然后將各自的最小值和最大值列印成一行兩個用空格分隔的長整數。
函式描述
在下面的編輯器中完成miniMaxSum函式的撰寫。
miniMaxSum有以下引數:
arr:一個陣列,包含兩個空格分隔的長整數。
arr:一個包含5個整數的陣列
列印
miniMaxSum有以下引數:
miniMaxSum有以下引數
列印
在一行中列印兩個以空格分隔的整數:5個元素中的4個元素的最小和和最大和
。輸入格式
一行中包含五個空格分隔的整數。
***這就是任務和我的代碼。**
require 'json'/span>
require 'stringio'/span>
#
#完成下面的'miniMaxSum'函式。
#
# 該函式接受INTEGER_ARRAY arr作為引數。
#
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
請幫助。
uj5u.com熱心網友回復:
將陣列中最小的4個元素和最大的4個元素相加不就可以了嗎?
你的問題在輸入方面有點不清楚,因此我提供兩個答案。
當輸入是一個5個整數的陣列時:
def min_max_sum(array)
sorted = array.sort
puts "#{sorted.first(4).sum} #{sorted.last(4) .sum}"
結束。
min_max_sum [5, 4, 3, 2, 1]
#=> 10 14]。
當輸入格式為單行五個空格分隔的整數時:
def min_max_sum(string)
sorted = string.split(/).map(&:to_i).排序
把"#{sorted.first(4).sum} #{sorted.last(4).sum}"/span>
end
min_max_sum "5 4 3 2 1"。
#=> 10 14
uj5u.com熱心網友回復:
我們可以觀察到,5個元素中的4個元素的總和只是所有5個元素的總和減去其中的一個。如果我們有[1,2,3,4,5],總和是15,我們可以通過減去每個元素得到部分的和。15-1是14,15-2是13,以此類推。
然后我們可以在一個回圈中找到最小和最大。
這在演算法上比對最大和最小的數字進行排序和求和更有效率。這個演算法只需要在串列中迭代兩次。它在2n時間內運行,即O(n)。排序需要O(nlogn)加上兩次迭代來求和。這對5個數字來說并不重要,但是當大小變大時,這就非常重要了。
參見時間復雜度。 uj5u.com熱心網友回復: 無論如何我解決了這個問題 .... 我在第二個回圈中使用了$res而不是$res2。然后在else條件中我加入了arr.pop。但感謝你的回答
標籤:def min_max_sum(nums)<
# 取每個數字的總和。
sum = nums.sum
# Ye olde min/max trick.
# 設定min為所有數字都小于的值。
# Set max to something everything will be larger than.
min = Float::INFINITY
max = -Float::INFINITY
# 對于每個數字...
nums.each do |num| >。
# 從sum中減去這個數字,得到5個值中4個值的總和。
partial_sum = sum - num
# 檢查它是否是最小值和/或最大值。
min = partial_sum if partial_sum < min
max = partial_sum if partial_sum > max
end
return [ min, max]
結束
#!/bin/ruby
require 'json'/span>
require 'stringio'/span>
#
#完成下面的'miniMaxSum'函式。
#
# 該函式接受INTEGER_ARRAY arr作為引數。
#
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 $res2 < $prev2 >。
i = i 1
end
print "#{$prev2} #{$prev}"
else
arr.pop
res = arr.sum
print "#{res} #{res}"
end
end
arr = gets.rstrip.split.map(&: to_i)
miniMaxSum arr
