我刚尝试了一个HackerRank挑战,如果一个问题给你x行输入,把x行设为let someVariable = readLine()根本就不会削减它,因为有很多测试用例可以拍摄更多输入到我们编写的代码,因此每行输入的硬编码readLine()都不会飞.
有没有办法让多行输入到一个变量?
Pet*_*ker 38
对于那些第一次尝试HackerRank挑战的人来说,你可能需要知道一些你可能从未遇到过的事情.我最近才知道这个叫做readLine()命令的魔法,它是Swift中的本机函数.
当HackerRank系统执行您的代码时,它会传递您输入的代码行,这是检索该输入的一种方式.
let line1 = readLine()
let line2 = readLine()
let line3 = readLine()
Run Code Online (Sandbox Code Playgroud)
line1现在被赋予问题中提到的第一行输入的值(或通过其中一个测试用例传递给您的代码),line2是第二行,依此类推.
您的代码可能工作得很好,但可能会在一堆其他测试用例中失败.这些测试用例不会向您的代码发送相同数量的输入行.这是值得深思的:
var string = ""
while let thing = readLine() {
string += thing + " "
}
print(string)
Run Code Online (Sandbox Code Playgroud)
现在,字符串变量包含要接收的所有输入(在本例中为String).
希望能帮助别人
:)
Vla*_*Nul 21
绝对不应该这样做:
while let readString = readLine() {
s += readString
}
Run Code Online (Sandbox Code Playgroud)
这是因为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
}
Run Code Online (Sandbox Code Playgroud)
如果您知道每一行都是整数,则可以使用:
let line = Int(readLine()!)!
Run Code Online (Sandbox Code Playgroud)
或者,如果您知道每一行是一个整数数组,请使用:
let line = readLine()!.characters.split(" ").map{ Int(String($0))! }
Run Code Online (Sandbox Code Playgroud)
或者如果每一行都是一个字符串数组:
let line = readLine()!.characters.split(" ").map{ String($0) }
Run Code Online (Sandbox Code Playgroud)
我希望这有帮助.
对于新版本,获取由空格分隔的数字数组
let numbers = readLine()!.components(separatedBy: [" "]).map { Int($0)! }
Run Code Online (Sandbox Code Playgroud)
readLine()和AnyGenerator构造Stringstd 输入行的数组readLine()将从标准输入逐行读取,直到到达 EOF,然后返回nil。
返回
Character从标准输入读取到当前行末尾或直到达到 EOF或nil如果已经达到 EOF 的 s。
这非常简洁,因为它是使用初始化器readLine()生成序列的完美候选者,初始化器递归地(as )调用,在equals 的情况下终止。AnyGeneratorinit(body:)next()bodybodynil
AnyGeneratorRun Code Online (Sandbox Code Playgroud)init(body: () -> Element?)创建一个
GeneratorType实例,其next方法调用body并返回结果。
这样,就不需要实际提供我们期望从标准输入获得的行数,因此,我们可以捕获标准输入的所有输入,例如放入数组中String,其中每个元素对应于一个输入行:
let allLines = AnyGenerator { readLine() }.map{ $0 }
// type: Array<String>
Run Code Online (Sandbox Code Playgroud)
之后,我们可以使用该String数组来应用解决给定任务(/HackerRank 任务)所需的任何操作。
// example standard input
4 3
<tag1 value = "HelloWorld">
<tag2 name = "Name1">
</tag2>
</tag1>
tag1.tag2~name
tag1~name
tag1~value
/* resulting allLines array:
["4 3", "<tag1 value = \"HelloWorld\">",
"<tag2 name = \"Name1\">",
"</tag2>",
"</tag1>",
"tag1.tag2~name",
"tag1~name",
"tag1~value"] */
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9676 次 |
| 最近记录: |