【发布时间】:2015-06-20 13:25:17
【问题描述】:
问题来了:
如果从左到右和从右到左读取时,它在十进制系统中的表示相同,则称为回文。对于给定的不超过 1000000 位的正整数 K,将大于 K 的最小回文数的值写入输出。数字始终显示不带前导零。
输入:第一行包含整数 t,即测试用例的数量。整数 K 在接下来的 t 行中给出。
输出:对于每个K,输出大于K的最小回文数。示例
输入:
2 808 第2133章
输出:
818 2222
还有我的Scala 代码:
object Pro_5 {
// find the next palindrome larger than K
def findPalindrome(input: String) = {
// start from (k + 1)
val tmp = (BigInt(input) + 1).toString
val length = tmp.length
val mid = length / 2
val left = tmp.substring(0, length >> 1)
val right = tmp.substring(length >> 1, length)
// whether continue for loop
var flag = true
// half of the result
var res = ""
for (i <- 0 until mid if flag) {
if (left(i) > right(mid - 1)) {
res = left
flag = false
} else if (left(i) < right(mid - 1)) {
res = (BigInt(left) + 1).toString()
flag = false
}
}
if (length % 2 == 0) {
res + res.reverse
} else {
res + tmp(mid) + res.reverse
}
}
// get K
def getInput(times: Int) = {
for (time <- 0 until times) yield readLine()
}
def main(args: Array[String]) {
// get compute times
val times = readInt()
getInput(times).map(findPalindrome(_)).foreach(println)
}
}
我从Mark Peters's answer学到了一些东西
但是当我在SPOJ 中运行它时,我仍然得到了time limit exceeding error.
你能帮我改进算法吗?
欢迎任何答案...
【问题讨论】:
-
它实际上在第一次测试中失败了
findPalindrome("808")---> "808" -
@harshtuna 你是对的,它失败了。我会改进我的代码。