字符串拼接法
构建一个 mutable.HashMap 把在里面新建 numRows 个字符串,用他们的行数作为 key,字符串作为 value,然后就构建一个 while,直到把所有的字符都遍历完成为止,这个算法不涉及任何的数学知识,就是相当于设置一个指针,在 n 行之间反复扫描,直到把所有的字符都扫描进去为止,最后再把这些字符串拼接一下作为答案返回
object Solution {
def convert(s: String, numRows: Int): String = {
if (s == "") ""
else if (numRows == 1) s
else {
val resMap = scala.collection.mutable.HashMap[Int, String]()
for (i <- 0 until numRows) resMap += (i -> "")
var switch = 0
var j = 0
var i = 0
for(j <- 0 until s.length) {
resMap(i) += s(j)
if (i >= numRows-1) switch = 1
else if (i <= 0) switch = 0
if (switch == 0) {
i += 1
} else if (switch == 1) {
i -= 1
} else switch == 0
}
var str = ""
for (i <- 0 until numRows) str += resMap(i)
str
}
}
}
另一种字符串拼接法
这个算法跑了几轮也没跑到时间 100%,就进去看了一下别人的 100% 解法,比我的快了 整整 100ms,所以研究后把这个方法解析在这里
这个方法的思路和我的算法思路基本相同,不同的是他应用了数组来进行存储,最后再把整个字符串放回去,这里就体现了对于语言的熟悉程度和水平了,这个层面上我自己是自视弗如,代码如下:
object Solution {
def convert(s: String, numRows: Int): String = {
if (numRows == 1 || numRows >= s.length) s
else {
var (row, step) = (0, 1)
lazy val empStr: String = ""
val arr: Array[String] = Array.fill[String](numRows)(empStr)
for (c <- s) {
arr(row) = arr(row) + c
if (row == 0) step = 1
else if (row == numRows - 1) step = -1
row += step
}
arr.mkString(empStr)
}
}
}