你能将String映射/缩减为Int吗?

时间:2017-10-30 11:21:37

标签: kotlin

我正在解决代码问题,我必须总结一个大数字的数字(它可以有多达10万个数字),我必须重复这个过程,直到只剩下一个数字并计算我这样做的次数,我想出了一个有效的解决方案,但是我想知道是否有些东西可以用更多的方式完成" Kotlin-ish like way"所以:

fun main(args: Array<String>) {
    println(transform(readLine()!!))
}

fun transform(n: String): Int {
    var count = 0
    var sum : Int
    var s = n
    while(s.length > 1) {
        sum = (0 until s.length).sumBy { s[it].toInt() - '0'.toInt() }
        s = sum.toString()
        count++
    }
    return count
}
  1. sum = (0 until s.length).sumBy { s[it].toInt() - '0'.toInt() }有没有办法让我猜测将字符串中的数字之和映射到sum变量,或者通常是比我使用的更好的方法?
  2. 将Char转换为Int时,它会将其转换为ASCII值,因此我必须添加&#34; - &#39; 0&#39; .toInt()&#34;是否有一种更快的方式(不是写得太多,不要好奇)?
  3. 如何在不创建新String并操纵它的情况下使String n可变?或者这是所希望的(也是唯一的)方式?
  4. P.S。我是Kotlin的初学者。

2 个答案:

答案 0 :(得分:3)

  

将Char转换为Int时,它会将其转换为ASCII值,所以我不得不添加“-'0'.toInt()”是否有更快的方式(不是写得太多,要求出于好奇心)?

你可以简单地写s[it] - '0',因为在Kotlin中减去Chars已经给你一个Int:

public class Char ... {
    ...
    /** Subtracts the other Char value from this value resulting an Int. */
    public operator fun minus(other: Char): Int
    ...
}

但是为什么在你可以直接遍历Chars时循环遍历索引呢?

sum = s.sumBy { it - '0' }

答案 1 :(得分:1)

这是一种解决它的功能(和递归)风格:

private fun sum(num: String, count: Int) : Int {
    return num
        //digit to int
        .map { "$it".toInt() } 
        //sum digits
        .sum()
        //sum to string
        .toString() 
        //if sum's length is more than one, do it again with incremented count. Otherwise, return the current count
        .let { if (it.length > 1) sum(it, count + 1) else count } 
}

你这样称呼它:

val number = "2937649827364918308623946..." //and so on
val count = sum(number, 0)

希望它有所帮助!