scala如何在n>;0
我想知道是否有一种更实用的方法来处理while(n>0)循环,我有一个小型Scala应用程序,它可以计算从1到n范围内等于K的位数: 例如,30和3将返回4[3,13,23,30]scala如何在n>;0,scala,while-loop,functional-programming,Scala,While Loop,Functional Programming,我想知道是否有一种更实用的方法来处理while(n>0)循环,我有一个小型Scala应用程序,它可以计算从1到n范围内等于K的位数: 例如,30和3将返回4[3,13,23,30] object NumKCount { def main(args: Array[String]): Unit = { println(countK(30,3)) } def countKDigit(n:Int, k:Int):Int = { var num = n
object NumKCount {
def main(args: Array[String]): Unit = {
println(countK(30,3))
}
def countKDigit(n:Int, k:Int):Int = {
var num = n
var count = 0
while (num > 10) {
val digit = num % 10
if (digit == k) {count += 1}
num = num / 10
}
if (num == k) {count += 1}
count
}
def countK(n:Int, k:Int):Int = {
1.to(n).foldLeft(0)((acc, x) => acc + countKDigit(x, k))
}
}
我正在寻找一种使用纯函数方法定义函数countKDigit的方法假设
K
始终为1位,您可以将n
转换为String
,并使用collect
或filter
,如下所示(您可以使用Integer
做的函数不多):
或
例如
以下方法如何:
scala> val myInt = 346763
myInt: Int = 346763
scala> val target = 3
target: Int = 3
scala> val temp = List.tabulate(math.log10(myInt).toInt + 1)(x => math.pow(10, x).toInt)
temp: List[Int] = List(1, 10, 100, 1000, 10000, 100000)
scala> temp.map(x => myInt / x % 10)
res17: List[Int] = List(3, 6, 7, 6, 4, 3)
scala> temp.count(x => myInt / x % 10 == target)
res18: Int = 2
计算数字序列中单个数字的出现次数
def countK(n:Int, k:Int):Int = {
assert(k >= 0 && k <= 9)
1.to(n).mkString.count(_ == '0' + k)
}
首先将数字
n
展开为一个数字序列
def digits(n: Int): Seq[Int] = {
if (n < 10) Seq(n)
else digits(n / 10) :+ n % 10
}
或者您可以使用flatMap
def countK(n:Int, k:Int):Int = {
1.to(n).flatMap(digits).count(_ == k)
}
您可以将
过滤器(c=>c.asDigit==k).length
替换为count(\uu.asDigit==k)
def countK(n:Int, k:Int):Int = {
assert(k >= 0 && k <= 9)
1.to(n).mkString.count(_ == '0' + k)
}
def countKDigit(n:Int, k:Int, acc: Int = 0):Int =
if (n == 0) acc
else countKDigit(n/10, k, if (n%10 == k) acc+1 else acc)
def digits(n: Int): Seq[Int] = {
if (n < 10) Seq(n)
else digits(n / 10) :+ n % 10
}
def countKDigit(n:Int, k:Int):Int = {
digits(n).count(_ == k)
}
def countK(n:Int, k:Int):Int = {
1.to(n).flatMap(digits).count(_ == k)
}