本文讲述了通过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;
}