青训营X豆包MarsCode 技术训练营第(五)课 | 豆包MarsCode AI 刷题

60 阅读5分钟

给大家分享一下我最近刷的几道题的解析,还有我对 AI 助手的使用心得,这是第一次给大家分享的刷题解析和经验分享,这个系列预计有六期,今天给大家带来第五期的分享。

今天的第一题 —— 计算从 1 到 n 之间 “好数” 的个数

问题描述
小 C 对 “好数” 非常感兴趣,她定义一个不含前导零的正整数为 “好数”,如果它的所有数位最多包含两种不同的数字。例如,数字 23,2323,9,111,和 101 都是好数。现在小 C 想知道,从 1 到 n 之间有多少个好数。比如当 n = 110 时,所有的 1 位数、2 位数,以及一些 3 位数(如 100,101)都是好数,一共有 102 个。

测试样例
样例 1:
输入:n = 110
输出:102

样例 2:
输入:n = 1000
输出:352

样例 3:
输入:n = 1
输出:1

解决方案
要解决这个问题,我们可以按照以下步骤进行:

  1. 遍历从 1 到 n 的所有数:

    • 通过一个循环,让变量 i 从 1 开始,每次递增 1,直到 i 等于 n 为止。这样就能依次检查从 1 到 n 的每一个整数是否为 “好数”。
  2. 将当前数转换为字符串:

    • 对于循环中的每一个整数 i,使用 Integer.toString () 方法将其转换为字符串形式。这样做是为了方便后续逐个检查该数的每一位数字。
  3. 使用集合记录不同的数位:

    • 创建一个 HashSet类型的集合,用于记录当前数中出现的不同数位。通过遍历该数转换后的字符串的每一个字符,将每个字符添加到集合中。由于集合的特性是不允许重复元素存在,所以最终集合中只会保留不同的数位。
  4. 判断是否为 “好数” 并计数:

    • 检查记录数位的集合的大小,如果集合大小不超过 2,就说明该数的所有数位最多包含两种不同的数字,那么这个数就是 “好数”。此时,将 “好数” 的计数变量 count 加 1。
  5. 返回 “好数” 的个数:

    • 在遍历完从 1 到 n 的所有数之后,计数变量 count 中存储的就是从 1 到 n 之间 “好数” 的个数,直接返回 count 即可。

import java.util.HashSet;
import java.util.Set;

public class Main {
    public static int solution(int n) {
        int count = 0;

        // 遍历从1到n的所有数
        for (int i = 1; i <= n; i++) {
            // 将当前数转换为字符串
            String numStr = Integer.toString(i);

            // 使用集合来记录不同的数位
            Set<Character> digits = new HashSet<>();
            for (char c : numStr.toCharArray() {
                digits.add(c);
            }

            // 如果集合的大小不超过2,则该数是“好数”
            if (digits.size() <= 2) {
                count++;
            }
        }

        return count;
    }

    public static void main(String[] args) {
        System.out.println(solution(110) == 102);
        System.out.println(solution(1000) == 352);
        System.out.println(solution(1) == 1);
    }
}

代码功能概述
这段代码主要实现了计算从 1 到 n 之间 “好数” 个数的功能。通过遍历每一个数,将其转换为字符串后用集合记录不同数位,再根据集合大小判断是否为 “好数” 并进行计数,最后返回 “好数” 的总数。

代码细节

类定义与函数布局:

  • Main是一个包含solution方法的公开类。solution方法接收一个整数参数 n,表示要检查的范围上限,返回一个整数结果,即从 1 到 n 之间 “好数” 的个数。

字符处理逻辑:

  • 在将整数转换为字符串后,通过遍历字符串的字符数组,将每个字符添加到集合中,以此来收集该数的不同数位。这种方式利用了集合的去重特性,方便后续判断。

结果拼接与返回:

  • 每判断一个数是否为 “好数”,符合条件就将计数变量 count 加 1。在遍历完所有数后,直接返回 count 作为最终的 “好数” 个数。

核心逻辑
这段代码的核心在于通过遍历和集合操作来判断每个数是否为 “好数”。通过将数转换为字符串以便于处理每一位数字,利用集合记录不同数位并根据集合大小做出判断,从而准确统计出 “好数” 的个数。由于需要遍历从 1 到 n 的每一个数,所以算法的时间复杂度为 O (n),其中 n 是输入的上限值。

总结
这段代码以一种较为直观的方式实现了计算从 1 到 n 之间 “好数” 个数的功能。通过合理运用字符串处理和集合操作,使得代码逻辑清晰易懂,能够准确地完成任务。这不仅加深了我们对遍历、字符串处理和集合应用的理解,也让我们看到了如何在类似的数字特征判断问题中运用这些基本的编程技巧。

我对 AI 助手的使用心得
在进行这道题的编程与算法学习的过程中,豆包 AI 助手依旧是我重要的解题工具。当我在理解如何通过集合来判断一个数是否为 “好数” 以及整个代码的逻辑流程时,AI 助手给我提供了清晰的解释和更多的参考思路。它帮助我更好地把握问题的关键所在,比如如何优化代码以提高效率等方面。AI 助手就像是一个随时在身边的导师,为我的学习和编程旅程提供了极大的便利与帮助,让我能更深入地探索编程知识和算法应用。希望我的这些体会能帮助到同样在编程之路上前行的朋友们!