我需要帮助找到正确的Scala方法,使这段代码更实用,更不易变。
def findMinTime(str: String, timeByCar: Int): Int = {
var myTime = timeByCar
var minTime = timeByCar
str.reverse.foreach { l =>
if (l == 'A') myTime += 3 else myTime -= 2
if (myTime < minTime) minTime = myTime
}
minTime
}发布于 2022-06-11 20:35:06
这里有一个使用foldLeft的解决方案。我们将每个字符(myTime和minTime)后需要修改的两个变量作为累加器存储在一个元组中。
def findMinTime(str: String, timeByCar: Int): Int = {
val (myTime, minTime) = str.reverse.foldLeft((timeByCar, timeByCar)) {
case ((myTime, minTime), l) =>
val newTime = if (l == 'A') myTime + 3 else myTime - 2
(newTime, newTime min minTime)
}
minTime
}发布于 2022-06-12 12:00:45
foldLeft是一种方法,当逻辑简单而简洁时,它很有用。但是,一般来说,scala中这类任务的入门工具是(尾)递归:
`
def findMinTime(str: String, timeByCar: Int) = {
@tailrec
def loop(str: List[Char], minTime: Int, myTime: Int): Int = str match {
case Nil => minTime
case 'A' :: tail => loop(tail, myTime+3, minTime min myTime+3)
case _ :: tail => loop(tail, myTime -2, minTime min myTime-2)
}
loop(str.toList.reverse, timeByCar, timeByCar)
}https://stackoverflow.com/questions/72587150
复制相似问题