2844.生成特殊数字的最少操作

目标

给你一个下标从 0 开始的字符串 num ,表示一个非负整数。

在一次操作中,您可以选择 num 的任意一位数字并将其删除。请注意,如果你删除 num 中的所有数字,则 num 变为 0。

返回最少需要多少次操作可以使 num 变成特殊数字。

如果整数 x 能被 25 整除,则该整数 x 被认为是特殊数字。

示例 1:

输入:num = "2245047"
输出:2
解释:删除数字 num[5] 和 num[6] ,得到数字 "22450" ,可以被 25 整除。
可以证明要使数字变成特殊数字,最少需要删除 2 位数字。

示例 2:

输入:num = "2908305"
输出:3
解释:删除 num[3]、num[4] 和 num[6] ,得到数字 "2900" ,可以被 25 整除。
可以证明要使数字变成特殊数字,最少需要删除 3 位数字。

示例 3:

输入:num = "10"
输出:1
解释:删除 num[0] ,得到数字 "0" ,可以被 25 整除。
可以证明要使数字变成特殊数字,最少需要删除 1 位数字。

说明

  • 1 <= num.length <= 100
  • num 仅由数字 '0' 到 '9' 组成
  • num 不含任何前导零

思路

有一个字符串表示的数字,每一次操作可以删除任意一个数字。问最少需要操作多少次能够使数字被25整除。

通过观察可知,能够被25整除,个位数字只能是 0 或 5。十位数字只能是 0、2、5、7 ,其中 如果 十位为 0 必须要有更高位不为0 num 不含任何前导零0、25、50、75、100、125、200、……、1000、1025、……,更高位的数字可以是任意的。如果个位是5,那么十位只能是 2、7,如果个位是 0,那么十位只能是 0、5

2908305 从末尾查找,如果保留5,需要删除中间 5 个,如果删掉5,保留0,则只需要再删除 8, 3 两个数字即可,我们应该取二者的最小值。这就是我们的贪心策略。

代码

/**
 * @date 2024-07-25 11:17
 */
public class MinimumOperations2844 {

    public int minimumOperations(String num) {
        int n = num.length();
        int res = 0;
        int cursor = n - 1;
        while (cursor >= 0 && num.charAt(cursor) != '0') {
            cursor--;
        }
        res = n - 1 - cursor;
        cursor--;
        while (cursor >= 0 && (num.charAt(cursor) != '0' && num.charAt(cursor) != '5')) {
            cursor--;
            res++;
        }

        int res5 = 0;
        cursor = n - 1;
        while (cursor >= 0 && num.charAt(cursor) != '5') {
            cursor--;
        }
        res5 = n - 1 - cursor;
        cursor--;
        while (cursor >= 0 && (num.charAt(cursor) != '2' && num.charAt(cursor) != '7')) {
            cursor--;
            res5++;
        }
        // 这里需要判断,前面个位为5,但是十位没有合法数字的情况,这时需要把5也删掉
        if (cursor < 0) {
            res5++;
        }
        return Math.min(res, res5);
    }

}

性能

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注