青训营X豆包MarsCode 45.最小步数归零问题 | 豆包MarsCode AI 刷题

77 阅读5分钟

问题描述

小R拿到了一个长度为n的数组,其中每个元素都是一个正整数。小R发现每次可以删除某个数组中某个数的一位数字,这样可以逐步将所有数字变为0。他想知道,要将数组中所有数字都变为0,最少需要多少步?

例如:对于数字 103,小R可以选择删除第1位数字,将其变为 3;或者删除第2位数字,变为 13,又或者删除第3位数字,将其变为 10。最终目标是将所有数字都删除为0。

代码

public class Main {
    public static int solution(int n, int[] a) {
        // write code here
        int num  = 0;
        int count = 0;
        for(int i = 0;i<n;i++){
            num = a[i];
            while(num>0)
            {
                count += (num%10>0)?1:0;
                num = num/10;
            }
        }
        //System.out.println(n+":"+count);
        return count;
    }

    public static void main(String[] args) {
        System.out.println(solution(5, new int[]{10, 13, 22, 100, 30}) == 7);
        System.out.println(solution(3, new int[]{5, 50, 505}) == 4);
        System.out.println(solution(4, new int[]{1000, 1, 10, 100}) == 4);
    }
}

以下是对上述代码的解析、相关知识总结、学习计划建议以及可能用到的工具介绍:

代码解析

1.  solution  方法:

  • 首先初始化了两个变量  num  和  count , num  用于临时存储数组中的每个数字, count  用于记录将所有数字变为 0 所需的步数。
  • 外层循环遍历输入数组  a 。对于每个数字  a[i] ,将其赋值给  num 。
  • 内层  while  循环用于计算将当前数字  num  变为 0 所需的步数。在循环中,通过  num % 10  取当前数字的个位数字,如果个位数字大于 0,则需要一步操作将其删除( count += (num%10>0)?1:0 ),然后将  num  更新为去掉个位数字后的数( num = num/10 ),循环直到  num  变为 0。 2.  main  方法:
  • 主要用于测试  solution  方法的正确性。它调用  solution  方法并传入不同的数组参数,然后将返回结果与预期结果进行比较并打印比较结果( true  或  false )。

知识总结

1. 算法思想: 采用了简单的遍历和逐位处理数字的思想。对于数组中的每个数字,通过不断取个位数字并更新数字的方式,计算将该数字变为 0 所需的步数,然后累计所有数字的步数。 2. 语言知识点: 变量定义与初始化:在 Java 中定义整型变量  num  和  count  并初始化。 循环结构:使用  for  循环遍历数组, while  循环处理单个数字的各位数字。 条件表达式: (num%10>0)?1:0  这种三元条件表达式用于根据条件决定是否增加步数。 基本数学运算: %  取模运算获取个位数字, /  除法运算更新数字去掉个位。

学习计划

1. 深入学习算法: 学习更多复杂的数组处理算法,如排序算法(冒泡排序、快速排序等)在数组中的应用,搜索算法(二分搜索等)如何与数组结合,以及动态规划算法在解决数组相关优化问题中的应用。可以通过阅读经典算法书籍如《算法导论》的相关章节,或者在线学习平台如 Coursera、EdX 上的算法课程来学习。 每周至少学习一种新的数组相关算法,并通过实际编程练习来巩固,例如实现不同排序算法并比较它们的性能。 2. 精通 Java 语言: 深入学习 Java 的面向对象特性,如类的继承、多态、接口等概念。可以通过阅读《Effective Java》等书籍来提升对 Java 语言的理解。 学习 Java 的常用设计模式,如单例模式、工厂模式等,并尝试在实际项目中应用。每个月学习 2 - 3 种设计模式,并进行代码实践。 学习 Java 的高级特性,如多线程编程、并发控制、反射机制等。通过编写多线程程序来处理数组数据,提高程序的效率和性能。 3. 实践与项目: 参与开源项目或者自己创建一些小型项目,如开发一个简单的数据分析程序,输入数组数据并进行统计分析等。在项目中运用所学的算法和 Java 知识,提高实际编程能力和问题解决能力。 定期参加线上或线下的编程竞赛,如 LeetCode 竞赛、ACM 竞赛等,与其他编程爱好者交流学习,拓宽编程思路。

工具运用

1. 开发工具: 使用 IntelliJ IDEA 或 Eclipse 等集成开发环境进行 Java 代码的编写、调试和运行。这些工具提供了代码自动补全、语法检查、调试工具等功能,能大大提高开发效率。 2. 版本控制工具: 学习使用 Git 进行代码版本控制。可以将代码托管到 GitHub 或 GitLab 等平台上,方便代码管理、备份以及与他人协作开发。 3. 代码分析工具: 利用 SonarQube 等代码分析工具对代码质量进行检查,它可以检测代码中的潜在缺陷、代码规范问题等,并提供改进建议,有助于提高代码的质量和可维护性。