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

118 阅读3分钟

本文讲述了通过JAVA解决 AI刷题 45. 最少步数归零问题

45. 最少步数归零问题

问题描述:

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

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

题目要求:

题目所给的函数声明为:public static int solution(int n, int[] a),即该函数接收一个表示数组长度的int类型,和所求的int类型的数组。返回最终将所有数组元素归零的次数, 类型为int。

题目样例:

测试样例

样例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

解析:

虽然题目所接收的是一个数组,但在实际解决的时候,可以将复杂的问题分解为一个可以通过相同方式解决的简单问题。解决简单问题进而解决复杂问题。在本题中,可以先通过遍历数组,将该问题看作求一个数归零步数的问题。最后通过一个变量累加,求得最终结果。

求单个数的归零步数:

在求一个数归零步数的时候,先创建一个int类型的变量存储步数。然后可以通过判断该数的个位数字是否为0,如果是0,则不需要删除该位数就可以让数字最终成为0,变量不自增;如果不是0,则必须要通过删除该位数来让数字达到0。变量自增。具体代码如下:

//tmp 为判断的数字
int count = 0;
if (tmp % 10 != 0) {
    count++;
}

为了求得一个数字归零步数的最终结果。可以通过循环,将所判断的数字不断除以10来判断每一位的数。修改后的代码如下:

int count = 0;
while (tmp > 0) {
    if (tmp % 10 != 0) {
        count++;
    }
    tmp /= 10;
}

通过如上方法可以求得单个数字的归零步数,进而求得数组内所有元素归零步数的和。

解题

显然,想求得数组内的总步数,仅需遍历数组,求得所有元素的步数,求和即可得到所求步数。修改后的代码如下:

public static int solution(int n, int[] a) {
    int count = 0;
    for (int i = 0; i < n; i++) {
        int tmp = a[i];
        while (tmp > 0) {
            if (tmp % 10 != 0) {
            count++;
            }
            tmp /= 10;
        }
    }
    return count;
}