我需要在不使用max
方法的情况下找到数组的最大值。现在我有:
def max(arr)
largest_num = arr(1)
arr.each do |num|
if element >= largest_num
largest_num = num
else
largest_num = largest_num
end
puts largest_num
end
my_numbers = [20, 30, 40, 50]
puts max(my_numbers)
end
答案 0 :(得分:2)
为什么不使用sort
和last
?
array = [3,7,2,4,6,1,8,5]
array.sort.last
#=> 8
答案 1 :(得分:1)
如果您需要使用 DECLARE @cols AS NVARCHAR(MAX)
, @query AS NVARCHAR(MAX);
SELECT @cols = STUFF(
(SELECT DISTINCT
','+QUOTENAME(CAST(ROW_NUMBER() OVER(PARTITION BY q.SectorID
, y.Name ORDER BY a.QuestionID) AS VARCHAR(10)))
FROM Answers a
LEFT JOIN Years y ON a.YearID = y.YearID
LEFT JOIN Organisations o ON a.OrganisationID = o.OrganisationID
LEFT JOIN Questions q ON a.QuestionID = q.QuestionID
FOR XML PATH(''), TYPE).value
('.', 'NVARCHAR(MAX)'), 1, 1, '');
SET @query = '
SELECT Organisation, Year, '+@cols+' from
(
SELECT QuestionID = ROW_NUMBER() OVER(PARTITION BY q.SectorID
, y.Name ORDER BY a.QuestionID)
, o.Name AS Organisation
, y.Name AS Year
, a.Answer
FROM Answers a
LEFT JOIN Years y ON a.YearID = y.YearID
LEFT JOIN Organisations o ON a.OrganisationID = o.OrganisationID
LEFT JOIN Questions q ON a.QuestionID = q.QuestionID
) src
pivot
(
max(Answer)
for QuestionID in ('+@cols+')
) piv
order by Organisation, Year
';
PRINT(@query);
EXECUTE (@query);
和sort
,则以下答案将不适合您。
last
效率低下,因为当你需要的是最大的时候,它需要对整个数组进行排序。尝试类似:
arr.sort.last
arr.reduce{|largest, num| if num > largest then num else largest end}
函数(也称为reduce
)用于将数组“缩减”为单个对象。要实现总和,您可以执行以下操作:
inject
num_arr = [1,2,3,4,5]
num_arr.reduce(0){|sum, num| sum + num} #=> 15
是总和的起始值,然后对于每个元素,块运行到目前为止的总和以及数组中的元素。然后返回块的结果(0
,因为在ruby中隐式返回最后一个语句)被设置为下一个元素的新值sum + num
。 sum
的最终值是返回的内容。
这类似于:
sum
如果未指定起始值,则将第一个元素作为起始值。因此,在我的sum = 0
sum = sum + num_arr[0]
sum = sum + num_arr[1]
sum = sum + num_arr[2]
sum = sum + num_arr[3]
sum = sum + num_arr[4]
解决方案中,第一个元素被设置为“最大”,然后对于每个元素依次传递最大值,或者如果元素大于当前最大元素,则它成为新元素最大。
答案 2 :(得分:1)
我被告知我应该使用.sort和.last但不太确定在哪里开始
在编程时成为自我启动者非常重要。这是一个必不可少的特征,因为该领域和所有技术都在迅速发展。我建议阅读" How much research effort is expected of Stack Overflow users?"另外,特别是如果你想使用Stack Overflow作为资源。
以下是如何学习使用Ruby进行实验并自学:
Ruby捆绑了IRB。在命令行键入irb
,它应该打开并向您显示提示。在该提示符下,您可以输入Ruby表达式并查看结果。我的提示可能与你的提示不一样,因为我的提示是自定义的,但你可以弄清楚如何使用它:
$ irb
irb(main):001:0>
将数组分配给变量:
irb(main):001:0> my_numbers = [20, 30, 40, 50]
=> [20, 30, 40, 50]
我可以通过输入变量名称并按返回或输入来查看分配给my_numbers
的值:
irb(main):002:0> my_numbers
=> [20, 30, 40, 50]
我可以尝试使用my_numbers
上的方法:
irb(main):003:0> my_numbers.shuffle
=> [50, 30, 40, 20]
接受了数组并将其随机化。它没有改变my_numbers
,它只是改组数组并以洗牌顺序输出一个新数组:
irb(main):004:0> my_numbers
=> [20, 30, 40, 50]
每次运行shuffle
时,它会随机化数组并返回另一个数组:
irb(main):005:0> my_numbers.shuffle
=> [50, 20, 30, 40]
irb(main):006:0> my_numbers.shuffle
=> [40, 20, 30, 50]
由于您希望使用sort
和last
来查找最大值,因此从无序数组开始会很好。测试sort
:
irb(main):009:0> my_numbers.shuffle.sort
=> [20, 30, 40, 50]
在洗牌后对数组进行排序。
这是last
的作用:
irb(main):010:0> my_numbers.last
=> 50
现在你已经足够了解自己。
答案 3 :(得分:0)
如果您真的被告知应该使用sort
和last
,那么答案很简单:
2.1.1 :003 > [2,3,1,4,8,6].sort.last
=> 8
如果你想要方法:
def max(arr); arr.sort.last; end
2.1.1 :004 > def max(arr); arr.sort.last; end
=> :max
2.1.1 :005 > max([2,1,3])
=> 3