字节跳动青训营伴学笔记1|豆包MarsCode AI刷题

40 阅读3分钟

问题描述

给定一个字符串 ss,该字符串中只包含英文大小写字母。你需要计算从字符串中最多能组成多少个字符串 "ku"。每次可以随机从字符串中选一个字符,并且选中的字符不能再使用。字符串中的字符大小写可以忽略,即大写和小写字母视为相同。

例如,输入 "AUBTMKAxfuu",从中最多能组成 1 个 "ku"

测试样例

样例1:

输入:s = "AUBTMKAxfuu"
输出:1

样例2:

输入:s = "KKuuUuUuKKKKkkkkKK"
输出:6

样例3:

输入:s = "abcdefgh"
输出:0

问题理解

我们需要从一个只包含英文大小写字母的字符串中,计算最多能组成多少个字符串 "ku"。字符串中的字符大小写可以忽略,即大写和小写字母视为相同。

数据结构选择

由于我们只需要统计字符 'k' 和 'u' 的个数,因此不需要复杂的数据结构,使用两个整数变量来记录 'k' 和 'u' 的个数即可。

算法步骤

  1. 转换为小写:将输入字符串转换为小写,以便忽略大小写。
  2. 统计字符个数:遍历字符串,统计字符 'k' 和 'u' 的个数。
  3. 计算结果:返回 'k' 和 'u' 中较小的那个数,因为每个 "ku" 需要一个 'k' 和一个 'u'。

具体步骤

  1. 转换为小写:使用 toLowerCase() 方法将字符串转换为小写。
  2. 统计字符个数:使用 for 循环遍历字符串中的每个字符,分别统计 'k' 和 'u' 的个数。
  3. 计算结果:使用 Math.min() 方法返回 'k' 和 'u' 中较小的那个数。

通过以上步骤,我们可以有效地计算出从字符串中最多能组成多少个字符串 "ku"

代码解释

public class Main {
    public static int solution(String s) {
        // 将字符串转换为小写,以便忽略大小写
        s = s.toLowerCase();
        
        // 统计字符 'k' 和 'u' 的个数
        int countK = 0;
        int countU = 0;
        
        for (char c : s.toCharArray()) {
            if (c == 'k') {
                countK++;
            } else if (c == 'u') {
                countU++;
            }
        }
        
        // 返回 'k' 和 'u' 中较小的那个数,因为每个 "ku" 需要一个 'k' 和一个 'u'
        return Math.min(countK, countU);
    }

    public static void main(String[] args) {
        System.out.println(solution("AUBTMKAxfuu") == 1);
        System.out.println(solution("KKuuUuUuKKKKkkkkKK") == 6);
        System.out.println(solution("abcdefgh") == 0);
    }
}

优势

  1. 简洁性

    • 代码结构清晰,逻辑简单明了,易于理解和维护。
  2. 高效性

    • 代码的时间复杂度为 O(n),其中 n 是字符串的长度。遍历一次字符串即可完成统计,性能上是高效的。
  3. 边界情况处理

    • 代码已经考虑了边界情况,例如字符串中没有 'k' 或 'u' 的情况,会返回 0。
  4. 测试用例充分

    • 代码中包含了三个测试用例,覆盖了正常情况和边界情况,测试用例是充分的。
  5. 忽略大小写

    • 通过将字符串转换为小写,代码能够正确处理大小写不敏感的情况。

延伸

  1. 扩展问题

    • 如果题目要求计算最多能组成多少个任意指定字符串(例如 "abc" 或 "xyz"),可以采用类似的思路,统计指定字符的个数,然后返回这些字符个数的最小值。
  2. 优化空间复杂度

    • 当前代码的时间复杂度为 O(n),空间复杂度为 O(1)。如果字符串非常大,可以考虑使用流式处理(如 Java 的 Stream API)来优化内存使用。
  3. 多线程处理

    • 如果字符串非常长,可以考虑使用多线程来并行处理字符串的不同部分,以提高性能。
  4. 错误处理

    • 可以添加错误处理逻辑,例如输入字符串为空或包含非字母字符的情况。

结论

通过以上步骤,我们可以有效地计算出从字符串中最多能组成多少个字符串 "ku"。代码简洁高效,且考虑了边界情况和大小写不敏感的要求。通过延伸思考,我们可以进一步扩展和优化解决方案。