最小步数归零问题
题意
问题描述
- 小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的位置上的数,不需要考虑位置关系,那么就让题目更加简单了。
- 每一步可以删除一个数字的某一位,如果该位不是0,则计为一步,对于是0的位置,直接跳过不需要计算结果。
- 所以其实就是统计每个数非0的数量的和,可以采用取余于10得到尾数的方式进行计数,得到的结果加起来就是最终结果。
-
数据结构选择:
- 使用整数数组来存储输入的数字。
- 使用整数变量来记录删除操作的步数。
-
实现步骤:
- 遍历数组中的每个数字,可以使用auto进行访问。
- 对于每个数字,逐位检查其每一位是否为0,这里采用的是取余于10的方法得到模数。
- 如果某一位不是0,则计数器增加1,如果是0,那么对结果没有贡献,直接跳过。
- 最终返回计数器的值作为结果。
算法步骤
-
初始化计数器:
- 创建一个整数变量
res并初始化为0,用于记录删除操作的步数。
- 创建一个整数变量
-
遍历数组:
- 使用
for循环遍历数组中的每个数字。
- 使用
-
逐位检查:
- 对于每个数字,使用
while循环逐位检查其每一位是否为0。 - 使用
x % 10获取最后一位数字,并检查其是否为0。 - 如果最后一位不是0,则
res增加1。 - 使用
x /= 10移除最后一位数字。
- 对于每个数字,使用
-
返回结果:
- 遍历完所有数字后,返回
res作为结果。
- 遍历完所有数字后,返回
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int solution(int n, vector<int>& a) {
int res = 0;
for(auto &x : a) {
while(x) {
res += (x % 10) != 0;
x /= 10;
}
}
return res;
}