我刚刚尝试了一个HackerRank挑战,如果一个问题给你x行输入,把x行设为let someVariable = readLine()根本不会削减它,因为有很多测试用例可以为我们编写的代码提供更多输入,因此每行输入的硬编码readLine()都不会飞。
有没有办法让多行输入到一个变量?
答案 0 :(得分:34)
对于那些第一次尝试HackerRank挑战的人来说,你可能需要知道一些你可能从未遇到过的事情。我最近才知道这个叫做readLine()命令的魔法,它是Swift中的原生函数。
当HackerRank系统执行您的代码时,它会传递您输入的代码行,这是检索该输入的一种方式。
let line1 = readLine()
let line2 = readLine()
let line3 = readLine()
line1现在给出了问题中提到的第一行输入的值(或者通过其中一个测试用例传递给你的代码),line2是第二行,依此类推。
您的代码可能工作得很好,但在其他一些测试用例中可能会失败。这些测试用例不会向您的代码发送相同数量的输入。这是值得深思的东西:
var string = ""
while let thing = readLine() {
string += thing + " "
}
print(string)
现在字符串变量包含要接收的所有输入(在本例中为String)。
希望能帮到某人
:)
答案 1 :(得分:21)
绝对不应该这样做:
while let readString = readLine() {
s += readString
}
这是因为Swift将永远期望输入字符串(来自readLine)并且永远不会终止,导致应用程序因超时而死亡。
相反,您应该在for循环中思考,假设您知道需要读取多少行,这通常是HackerRank中的这种方式;)
尝试这样的事情:
let n = Int(readLine()!)! // Number of test cases
for _ in 1 ... n { // Loop from 1 to n
let line = readLine()! // Read a single line
// do something with input
}
如果你知道每一行是一个整数,你可以使用它:
let line = Int(readLine()!)!
或者,如果您知道每一行是一个整数数组,请使用:
let line = readLine()!.characters.split(" ").map{ Int(String($0))! }
或者如果每一行都是一个字符串数组:
let line = readLine()!.characters.split(" ").map{ String($0) }
我希望这会有所帮助。
答案 2 :(得分:7)
对于新版本,获取以空格分隔的数字数组
let numbers = readLine()!.components(separatedBy: [" "]).map { Int($0)! }
答案 3 :(得分:4)
readLine()
和AnyGenerator
构建标准输入行的String
数组 readLine()
将逐行读取标准输入,直至达到EOF,然后返回nil
。
从标准输入到结尾返回
Character
的读取 当前行或直到达到EOF,如果已经EOF,则为或nil
达到
这非常简洁,因为它使readLine()
成为使用AnyGenerator
初始值设定项init(body:)
生成序列的理想候选者,递归地(如next()
)调用{{1} },终止以防body
等于body
。
<强>
nil
强>AnyGenerator
创建
init(body: () -> Element?)
方法,其GeneratorType
方法调用next
并返回结果。
有了这个,就不需要实际提供我们期望的标准输入行数,因此,我们可以从标准输入中捕获所有输入,例如进入body
数组,其中每个元素对应一个输入行:
String
之后我们可以使用let allLines = AnyGenerator { readLine() }.map{ $0 }
// type: Array<String>
数组来应用解决给定任务所需的任何操作(/ HackerRank任务)。
String
答案 4 :(得分:3)
我最近发现了获得一定数量线条的巧妙技巧。我会假设第一行给你的线数:
vtkPropPicker
答案 5 :(得分:0)
我通常使用这种形式。
if let line = readLine(), let cnt = Int(line) {
for _ in 1...cnt {
if let line = readLine() {
// your code for a line
}
}
}