HUAWEI 机试题:单词接龙

🌈 Scala 实现

题目描述:

  • 单词接龙的规则是:

    • 用于接龙的单词首字母必须要前一个单词的尾字母相同;
    • 当存在多个首字母相同的单词时,取长度最长的单词,如果长度也相等,则取字典序最小的单词;
    • 已经参与接龙的单词不能重复使用。
  • 现给定一组全部由小写字母组成单词数组,并指定其中的一个单词作为起始单词,进行单词接龙。

  • 请输出最长的单词串,单词串是单词拼接而成,中间没有空格。

输入描述:

  • 输入的第一行为一个非负整数,表示起始单词在数组中的索引K,0 <= K < N。
  • 输入的第二行为一个非负整数,表示单词的个数N。
  • 接下来的N行,分别表示单词数组中的单词。

输出描述:

  • 输出一个字符串,表示最终拼接的单词串。

备注:

  • 单词个数N的取值范围为[1, 20]
  • 单个单词的长度的取值范围为[1, 30]

示例

输入:

  • 0
  • 6
  • word
  • dd
  • da
  • dc
  • dword
  • d

输出:

  • worddwordda

说明:

  • 先确定起始单词word,再接以d开头的且长度最长的单词dword,剩余以d开头且长度最长的有dd、da、dc,则取字典序最小的da,所以最后输出worddwordda。

输入:

  • 4
  • 6
  • word
  • dd
  • da
  • dc
  • dword
  • d

输出:

  • dwordda

说明:

  • 先确定起始单词dword,剩余以d开头且长度最长的有dd、da、dc,则取字典序最小的da,所以最后输出dwordda。

代码:

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

    // 获取输入
    val k = StdIn.readLine().toInt
    val n = StdIn.readLine().toInt
    var buffer = new ListBuffer[String]()
    for (i <- 1 to n) {
        buffer += StdIn.readLine()
    }

    // 记录结果
    var res = new StringBuffer()

    // 记录第一个单词
    res.append(buffer(k))
    buffer -= buffer(k)

    var flag = true
    while (flag) {
        // 控制循环退出
        breakable {

            // 确定下一个单词首字母
            val nextPre = res.substring(res.length() - 1)

            // 对剩下单词排序
            buffer = buffer.sortWith((o1: String, o2: String) => {
                if (!o1.length.equals(o2.length)) {
                    // 当存在多个首字母相同的单词时,取长度最长的单词(降序)
                    o1.length.compareTo(o2.length) > 0
                } else {
                    // 如果长度也相等则取词典序最小的单词(升序)
                    o1.compareTo(o2) < 0
                }
            })

            // 找到下一个单词
            for (elem <- buffer) {
                if (elem.startsWith(nextPre)) {
                    res.append(elem)
                    buffer -= elem
                    break // 如果找打,直接跳出循环
                }
            }

            // 当无法跳出时,则证明没有下一个单词,此时置为 false
            flag = false
        }
    }

    // 输出结果
    println(res)
}

 


❤️ END ❤️
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

JOEL-T99

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

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

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

打赏作者

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

抵扣说明:

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

余额充值