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

150 阅读2分钟

一、问题描述

小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的个数。


六、函数的使用

  • 数字转换成字符串
  • 字符串转换成字符数组
  • 字符串的长度