我有一个数组[2, 4, 6, 8, 3]
,我需要将其转换为输出流,如下所示:
2 4 6 8 3
转换成字符串并切断逗号和引号没有帮助,因为如果它是一个字符串,它总是打印为“2 4 6 8 3”。
这是给出的输入:
5
2 4 6 8 3
这是我写的代码
def insertionSort( ar)
key = ar.last
(ar.size-2).downto(0){
|x|
if(key < ar[x])
ar[x+1] = ar[x]
p ar
else
ar[x+1] = key
p ar
break
end
}
end
# Tail starts here
count = gets.to_i
ar = gets.strip.split.map {|i| i.to_i}
insertionSort( ar )
我的输出:
[2, 4, 6, 8, 8]
[2, 4, 6, 6, 8]
[2, 4, 4, 6, 8]
[2, 3, 4, 6, 8]
预期输出:
2 4 6 8 8
2 4 6 6 8
2 4 4 6 8
2 3 4 6 8
测试结果: 失败
答案 0 :(得分:2)
你的问题一点也不清楚,但也许这就是你想要的:
ary = [2, 4, 6, 8, 3]
ary.join(' ') # => "2 4 6 8 3"
ary * ' ' # => "2 4 6 8 3"
也许你不明白如何循环?
ary = [2, 4, 6, 8, 3]
5.times do
puts ary.join(' ')
end
# >> 2 4 6 8 3
# >> 2 4 6 8 3
# >> 2 4 6 8 3
# >> 2 4 6 8 3
# >> 2 4 6 8 3
或者您可能不了解命令行应用程序如何读取STDIN?
在编写管道时处理STDIN非常有用:将一个小型专用应用程序链接到另一个,并让它们共同完成一项大任务是* nix系统的基本前提。尝试做所有事情的单片应用程序是编写/维护和使用的主要PITA。
如果您想从STDIN或键盘读取单行输入,gets
是好的。如果您想阅读一系列内容,请查看Ruby的ARGF类,并熟悉STDIN
和$stdin
的工作原理。
编写Ruby命令行脚本很简单,但就像在Perl,Python或C中一样,你必须知道如何访问传入数据,它是什么类型的数据(总是一个字符串),以及它的结构:由换行符("\n"
)或回车符+换行符("\r\n"
)终止的字符。
也许你不明白to_i
是如何运作的?
"2 4 6 8 3".to_i # => 2
"24683".to_i # => 24683
"2_4_6_8_3".to_i # => 24683
to_i
从第一个字符读取字符串并继续,直到找到非数字。因此,在上面的示例中,2
是第一个字符串中的第一个数字,后跟一个空格。该空格为非数字,因此to_i
停止处理并仅返回2
。在第二个示例中,没有空格,因此to_i
处理整个字符串并将其作为单个值返回。第三,因为Ruby像其他语言一样接受_
作为数字字符串的一部分,to_i
会再次返回完整值。 _
用于标记值中的逗号位置,例如1_000_000
。
在编写更多代码时,请花点时间清楚干净地编写代码。您需要能够降低视觉噪音并使其易于进入大脑的代码。 Ruby可以很容易地编写易于理解的干净和富有表现力的代码,但糟糕的编码风格可以使Ruby代码快速无法读取,特别是对于那些习惯于以惯用风格编写它的人来说。
这不是尝试修复算法,只是为了说明如何设置代码样式:
def insertion_sort(ar)
key = ar.last
(ar.size - 2).downto(0) { |x|
if (key < ar[x])
ar[x + 1] = ar[x]
p ar
else
ar[x + 1] = key
p ar
break
end
}
end
# Tail starts here
count = gets.to_i
ar = gets.strip.split.map { |i| i.to_i }
insertion_sort(ar)
答案 1 :(得分:0)
> a = [1, 2, 3, 4]
> puts "[#{a.join(', ')}]"
=> [1, 2, 3, 4]
不适用于多维数组或数组中的数组。
> a = [1, 2, [3, 4, 5, 6], [7, 8, 9]]
> puts "[#{a.join(', ')}]"
=> [1, 2, 3, 4, 5, 6, 7, 8, 9]
但是,如果你这样做,它应该适用于多维数组:
示例1:
> a = [1, 2, [3, 4, 5, 6], [7, 8, 9]]
> a.each do |sub_a|
> puts "[#{a.join(', ')}]"
> end
=> [1, 2, [3, 4, 5, 6], [7, 8, 9]]
示例2:
> a = [1, [2, [3, 4, [5, 6, 7, 8], 9, 0]], 'x', 'y', 'z']
> a.each do |sub_a|
> puts "[#{a.join(', ')}]"
> end
=> [1, [2, [3, 4, [5, 6, 7, 8], 9, 0]], "x", "y", "z"]
答案 2 :(得分:0)
在阅读您引用的HackerRank "Insertion Point" question后,输入似乎来自stdin。如果您的代码包含
s = gets
它会等你输入一个字符串。假设您输入1 2 3 4
(无引号)。然后s
将保留"1 2 3 4\n"
。
如果要将其转换为数组:
a = s.split # => ["1","2","3","4"]
如果您希望a
的元素是整数,而不是字符串:
a.map! {|e| e.to_i} # => [1,2,3,4]
其中(因为Ruby版本1.9)也可以编写:
a.map!(&:to_i) # => [1,2,3,4]
'Ruby方式'将链接这些操作:
a = gets.split.map(&:to_i) # => [1,2,3,4]
请注意,我们现在不需要!
地图。
如果您希望此数组为某些(现有数组)i
b
b[i] = a