【问题标题】:Kotlin: Run length encodingKotlin:运行长度编码
【发布时间】:2020-05-21 15:55:55
【问题描述】:

程序可以运行,但是,我仍然遇到一个逻辑错误:最后一个字母没有运行。例如,当我输入 aaaabbbbccccdddd 时,我得到的输出是 a4b4c4 但没有 d4。

fun main () {

    val strUser = readLine()!!.toLowerCase()
    val iLength = strUser!!.length
    var iMatch : Int = 0
    var chrMatch : Char = strUser[0]

    for (i in 0..iLength) {

        if (strUser[i] == chrMatch) {

            iMatch += 1
        }else {
            print("$chrMatch$iMatch")
            chrMatch = strUser[i]
            iMatch = 1

        }


    }


}

【问题讨论】:

  • 当你迭代某些东西时,你需要比它的大小或长度小一,因为计数从零开始。在这种情况下,您可以完全消除iLength 变量并使用for (i in strUser.indices)。或者更简单地说,您可以使用 for (chr in strUser) 之类的东西并使用 chr 代替 strUser[i]
  • “抛出这个错误” - 你得到什么错误?
  • 这是一个逻辑错误@halfer,例如当我输入 aaaabbbbccccdddd 时,我得到的输出是 a4b4c4 但没有 d4

标签: kotlin stringindexoutofbounds


【解决方案1】:

有很多解决方案,但最好的是RegExp

fun encode(input: String): String =
    input.replace(Regex("(.)\\1*")) {
        String.format("%d%s", it.value.length, it.groupValues[1])
    }

demo

测试结果

println(encode("aaaabbbbccccdddd")) // 4a4b4c4d

【讨论】:

    【解决方案2】:

    strUser 包含索引从0iLength - 1 的字符,所以你必须写for (i in 0 until iLength) 而不是for (i in 0..iLength)

    但是 Tenfour04 是完全正确的,你可以在没有索引的情况下迭代 strUser

    fun main() {
        val strUser = readLine()!!.toLowerCase()
        var iMatch: Int = 0
        var chrMatch: Char = strUser[0]
    
        for (char in strUser) {
            if (char == chrMatch) {
                iMatch += 1
            } else {
                print("$chrMatch$iMatch")
                chrMatch = char
                iMatch = 1
            }
        }
    }
    

    【讨论】:

    • strUser 包含索引从 0 到 iLength - 1 的字符。
    • @forpas 感谢您的关注!我是认真的,但打错了:)
    【解决方案3】:

    有趣的主(){

    val strUser = readLine()!!.toLowerCase()
    var iMatch : Int = 0
    var chrMatch : Char = strUser[0]
    
    for (char in strUser+1) {
    
        if (char == chrMatch) {
    
            iMatch += 1
        }else {
            print("$chrMatch$iMatch")
            chrMatch = char
            iMatch = 1
    
        }
    
    
    }
    

    }

    【讨论】:

      【解决方案4】:
      fun runLengthEncoding(inputString: String): String {
              val n=inputString.length
              var i : Int =0
              var result : String =""
              while(i<n){
                  var count =1
                  while(i<n-1 && inputString[i] == inputString[i+1]){
                      count ++
                      i++
                  }
      
                  result=result.toString()+count.toString()+inputString[i].toString()
                  i++
              }
              return result
          }
      

      【讨论】:

        猜你喜欢
        • 2013-02-01
        • 2012-07-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多