一、问题描述
小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
三、思路
如果数字是10的倍数,比如500,那么可以只去掉前面的一个数字,就能使得新数字为0(1步即可)。如果数字不是10的倍数,比如50055,这时需要先去掉后面的两个5,再去掉前面的5,才能使新数字为0(需要3步)。3步可以分解为5位数的5减去两个0的2,即3=5-2(数字位数减0的个数)。
四、代码
public static int solution(int n, int[] a) {
int cnt=0;
for(int i=0;i<n;i++){
if(a[i]%10==0){
cnt++;
}
else{
String str=String.valueOf(a[i]);
int num=0;
for(char ch:str.toCharArray()){
if(ch=='0'){
num++;
}
}
cnt=cnt+str.length()-num;
}
}
return cnt;
}
五、代码详解
if(a[i]%10==0){
cnt++;
}
如果数字是10的倍数,步数加1.
else{
String str=String.valueOf(a[i]);
int num=0;
for(char ch:str.toCharArray()){
if(ch=='0'){
num++;
}
}
cnt=cnt+str.length()-num;
}
如果数字不是10的倍数,先用valueOf将数字转成字符串,用toCharArray将字符串转成字符数组,然后遍历计算0的个数。最后步数加字符串长度(数字位数)减0的个数。
六、函数的使用
- 数字转换成字符串
- 字符串转换成字符数组
- 字符串的长度