它是一種尋找等差數列的缺失序列并找出其共同差異并檢查它是遞增序列還是遞減序列的代碼。獲取用戶輸入以進行進一步操作
例如:輸入陣列元素
2 4 6 10 12 14
缺少的數字是 8 而不是
輸入陣列元素
2
4
6
10
12
14
缺少的數字是 8
puts "enter arithmetic sequence"
o = Array.new
x = gets.chomp
item = x.split(" ")
o.push(item)
puts "#{o}"
len = o.length
sum = (len 1) * (o[0] o[len - 1]) / 2
summ = 0
o.each { |a| summ =a }
res = sum - summ
if(o[1]>o[0])
puts "its an increasing sequence"
else
puts "its a decreasing sequence"
end
common_difference = o[1] - o[0]
puts "Common difference is #{common_difference}"
puts "missing number is #{res}"
sum common difference 之類的操作是有效的,但要求是我們需要在一行中接收用戶輸入,而不是在多行中接收用戶輸入,將其拆分并存盤在一個陣列中。為了計算總和,我使用了實際總和 - 目標總和方法。
Main issue is that it rise an error
`*': Array can't be coerced into Integer
如何使用 to_i 方法或 Integer 方法將字串格式的陣列元素轉換為 int
Expected Output
i/p 2 4 6 8 12 14
o/p
missing number 10
uj5u.com熱心網友回復:
要求是我們需要在一行中獲取用戶輸入而不是在多行中獲取用戶輸入,將其拆分并存盤在陣列中
gets.chomp 回傳一個洗掉了尾隨換行符的字串,例如(第二行是用戶輸入)
x = gets.chomp
2 4 6 8 12 14
x #=> "2 4 6 8 12 14"
split 將該字串轉換為陣列:
x.split
#=> ["2", "4", "6", "8", "12", "14"]
缺少的是轉換為整數。要轉換陣列的每個元素,有map:
x.split.map { |s| s.to_i }
#=> => [2, 4, 6, 8, 12, 14]
或其簡寫:
x.split.map(&:to_i)
#=> => [2, 4, 6, 8, 12, 14]
應用于您的代碼:
puts "enter arithmetic sequence"
x = gets.chomp
o = x.split.map(&:to_i)
puts "#{o}"
# ...
請注意,無需創建空陣列。您可以將結果分配給mapto o。
您的其余代碼似乎按預期作業。但是您應該查看Cary Swoveland 的答案,以獲取更簡潔的查找缺失元素的方法。
uj5u.com熱心網友回復:
嘗試這個:
def missing_number(arr)
((arr.size 1) * (arr.first arr.last))/2 - arr.sum
end
missing_number [2, 4, 6, 10, 12, 14] #=> 8
missing_number [11, 8, 5, 2, -4, -7] #=> -1
missing_number [1.2, 2.0, 2.4, 2.8, 3.2] #=> 1.6000000000000014
假設arr沒有丟失任何值。例如,
arr = [2, 4, 6, 8, 10, 12, 14]
然后:
arr.sum
#=> 56
其中,因為它是一個算術級數,我們可以替代地計算如下:
(arr.size * (arr.first arr.last))/2
#=> 56
實際上,
arr = [2, 4, 6, 10, 12, 14]
和
arr.sum
#=> 48
正如我上面解釋的,我們可以計算arr插入缺失值后的值的總和,如下所示:
((arr.size 1) * (arr.first arr.last))/2
#=> 56
因此缺失值等于56 - 48 #=> 8。
這是另一種查找缺失值的方法,它的效率稍低,但具有避免舍入錯誤的優點(因為僅使用加法和除以 2,后者通過位移實作)。
def missing_number(arr)
arr.each_cons(2).max_by { |a,b| (b-a).abs }.sum/2
end
missing_number [2, 4, 6, 10, 12, 14] #=> 8
missing_number [11, 8, 5, 2, -4, -7] #=> -1
missing_number [1.2, 2.0, 2.4, 2.8, 3.2] #=> 1.6
認為
arr = [11, 8, 5, 2, -4, -7]
步驟如下。
enum = arr.each_cons(2)
#=> #<Enumerator: [11, 8, 5, 2, -4, -7]:each_cons(2)>
通過將列舉轉換為陣列,我們可以看到列舉器將生成??并傳遞給Enumerable#max_by的 (5) 個值:
enum.to_a
#=> [[11, 8], [8, 5], [5, 2], [2, -4], [-4, -7]]
接下來讓我們看看 max_by 將比較的值:
enum.map { |a,b| (b-a).abs }
#=> [3, 3, 3, 6, 3]
因此,我們得到以下資訊:
c = enum.max_by { |a,b| (b-a).abs }
#=> [2, -4]
最后兩步計算 2 和 -4 的平均值:
d = c.sum
#=> -2
d/2
#=> -1
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/370147.html
