最少步数归零问题 | 豆包 MarsCode AI 刷题

109 阅读5分钟

问题描述

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

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


测试样例

样例1:

输入:n = 5,a = [10, 13, 22, 100, 30]
输出:7

样例2:

输入:n = 3,a = [5, 50, 505]
输出:4

样例3:

输入:n = 4,a = [1000, 1, 10, 100]
输出:4

简单分析下这个问题,我们需要删除一个数的位数,最终将这个数,以及整个数组中所有的数都删成0。

最差的情况下,我们需要删除一个数的所有位,但在给出的例子中我们发现了一个问题,0不能存在于数的首位,即我们删掉 103 的 1 后, 0不能独立存在。

极端情况下,1000000003删去一个数 1 后,直接就变成了 3。

也就是说,维持这个数存在的是它的非零位,所以我们只需要统计非零位即可。

  public static int solution(int n, int[] a) {
        // write code here
        int count = 0;
        for(int num : a){
            String numstr = Integer.toString(num);
            char[] numcharlist = numstr.toCharArray();
            for(char ch :numcharlist){
                if(ch!='0')
                count++;
            }
        }
        return count;
    }

给的是int数组,我们将它转成string,再遍历每一位,统计非零数,返回,解决。

现在我们来调戏下AI:

  • - 给我一些代码提示

问题分析

你需要计算将数组中所有数字变为0所需的最少步数。每一步可以删除一个数字的一位。

当前代码分析

你的代码已经基本正确地计算了每个数字的非零位数,并将这些位数累加起来。然而,题目要求的是最少步数,而不是简单的非零位数累加。

提示

  1. 理解题目要求:你需要考虑的是如何通过最少的步数将所有数字变为0。这意味着你需要考虑每个数字的位数,而不是简单地累加非零位数。
  2. 优化计算:你可以考虑每个数字的位数,而不是每个非零位。例如,数字 103 有3位,数字 10 有2位。你需要计算每个数字的位数,并累加这些位数。
  • - 那你觉得我这个方法有什么逻辑问题吗

你的方法在逻辑上有一个关键问题:它简单地累加了每个数字的非零位数,而不是考虑如何通过最少的步数将所有数字变为0。

正确逻辑

正确的逻辑应该是计算每个数字的位数,而不是每个非零位数。例如,数字 103 有3位,数字 10 有2位。你需要计算每个数字的位数,并累加这些位数。

- 你觉得该尝试遍历所有删除方案,取最值吗

遍历所有删除方案并取最值的方法在理论上是可以解决这个问题的,但在实际应用中可能会导致时间复杂度过高,尤其是在数组长度较大或数字位数较多的情况下。

问题分析

题目要求的是最少步数,而不是简单的非零位数累加。例如,对于数字 103,你可以通过删除第1位数字将其变为 3,或者删除第2位数字将其变为 13,又或者删除第3位数字将其变为 10。最终目标是将所有数字都删除为0。

遍历所有删除方案的复杂度

遍历所有删除方案的复杂度会非常高,因为每个数字的每一位都可以选择删除,这会导致指数级的复杂度。例如,一个数字有 d 位,那么就有 d 种删除方案。如果有 n 个数字,每个数字有 d 位,那么总的删除方案数就是 n * d 的指数级增长。

优化思路

实际上,题目要求的是最少步数,而不是遍历所有删除方案。你可以直接计算每个数字的位数,并累加这些位数,因为每个数字的位数就是将其变为0所需的最少步数。

  • - 但103有3位,却只需要2步

你是对的,对于数字 103,确实只需要2步就可以将其变为0。我们需要更仔细地考虑如何计算最少步数。

问题分析

题目要求的是最少步数,而不是简单的非零位数累加。例如,对于数字 103,你可以通过删除第1位数字将其变为 3,或者删除第2位数字将其变为 13,又或者删除第3位数字将其变为 10。最终目标是将所有数字都删除为0。

正确逻辑

正确的逻辑应该是计算每个数字的位数,并考虑如何通过最少的步数将所有数字变为0。对于每个数字,最少步数等于其位数减去1。

好了,AI已经坏掉了,等我的AI修好再水文吧