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 不含任何前导零

解题思路:

见代码注释

code

class Solution {
public:
    //能被25整除的整数的规律
    //0 25 50 75 100 125 150 175 200....
    //可以看到能被25整除的数最后两位都是00,25,50,75
    //那么最后两位是00,25,50,75就一定能够被25整除吗?
    //x = 100k + 00
    //x = 100k + 25
    //x = 100k + 50
    //x = 100k + 75
    //也就是最后两位是以上四种组合一定能够被25整除并且能被25整除的整数最后两位也是以上四种组合
    //找到得到最后两位都是以上四种组合的最小删除次数
    //00:从后向前查找,分别找到两个零的idx
    //25:从后向前查找,分别找到二和五的idx
    //50:从后向前查找,分别找到五和零的idx
    //75:从后向前查找,分别找到七和五的idx
    
    //删除全部结果为0,也就是最后一定会有一个结果:len(num)
    //并且从10上来看,如果存在一个零的话,那么最后并不用全部删除,只需要删除到只剩一个零即可,也就是len(num-1)
    
    //min函数语法学习
    //min<datatype>({several datas more than two})

    int match(string & num,string sub)
    {
        int len = num.size();

        int idx1 = num.rfind(sub[1]);
        if(idx1 == -1 || idx1 == 0) return len;
        int idx2 = num.rfind(sub[0],idx1 - 1);
        if(idx2 == -1) return len;

        return len - idx2 - 2;
    }
    int minimumOperations(string num) {
        int len = num.size();
        int ans = len;

        if(num.find('0') != -1) ans = len - 1;
        
        //cout<<match(num,"25")<<endl;
        return min({ans,match(num,"00"),match(num,"25"),match(num,"50"),match(num,"75")});

    }
};
posted on 2023-09-04 15:03  huangxk23  阅读(42)  评论(0编辑  收藏  举报