HUAWEI 机试题:连续字母长度

该博客介绍了如何使用Scala解决一个字符串处理问题,即找到给定字符串中长度第k长的由同一字母组成的子串。输入是一个仅包含大写字母的字符串和一个整数k,输出是满足条件的子串长度。通过遍历字符串并使用差分方法记录连续字母出现的次数,然后进行排序和计数,最终得出结果。示例展示了不同输入和输出情况。
摘要由CSDN通过智能技术生成

🌈 Scala 实现

题目描述:

  • 给定一个字符串,只包含大写字母,求在包含同一字母的子串中,长度第 k 长的子串的长度,相同字母只取最长的那个子串。

输入描述:

  • 第一行有一个子串(1<长度<=100),只包含大写字母。
  • 第二行为 k的值

输出描述:

  • 输出连续出现次数第k多的字母的次数。

示例

输入:

  • AABAAA
  • 2

输出:

  • 1

说明:

  • 同一字母连续出现最多的A 3次
  • 第二多2次 但A出现连续3次

输入:

  • AAAAHHHBBCDHHHH
  • 3

输出:

  • 2

说明:

  • 同一字母连续出现的最多的是A和H,四次
  • 第二多的是H,3次

代码:

def main(args: Array[String]): Unit = {

    // 获取输入
    val line = StdIn.readLine().toList
    val k = StdIn.readLine().toInt

    var count = 1
    val buffer = new ListBuffer[Tuple2[Char, Int]]

    // 差分输入
    for (i <- 1 until line.length) {

        // 记录每一次的字符及次数
        if (line(i) == line(i - 1)) {
            count += 1
        } else {
            buffer += Tuple2(line(i - 1), count)
            count = 1
        }

        // 获取最后的字符及次数
        if (i == line.length - 1) buffer += Tuple2(line(line.length - 1), count)

    }

    // 如果子串中只包含同一字母的子串数小于k,则输出-1
    if (buffer.length < k) {
        println(-1)
        return
    }

    // 排序
    val tuples = buffer.sortWith((o1, o2) => {
        if (!o1._2.equals(o2._1)) o1._2.compareTo(o2._2) > 0 else o1._1.compareTo(o2._1) > 0
    })

    // 获取输出
    var res = 1
    for (i <- 1 to k) {
        if (tuples(i)._1 == tuples(i - 1)._1) res += 1 else res = 1
    }
    println(res)
}

 


❤️ END ❤️
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JOEL-T99

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值