力扣2844. 生成特殊数字的最少操作随笔

“日省其身,有则改之,无则加勉。”——《朱子全书·论语》

题目

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

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

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

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

难度:中等

分析

        虽然做出来了,但是做得不够好💪,故此记录一下。对整数删减后可以被25整除的情况进行分类讨论:删减后结尾为00,25,50,75;原数含有1个0(2个0及以上属前种情况)则删减至1个0;原数中没有0删除全部。我们可以多次遍历判断各种情况,也可以使用哈希表记录某个数是否出现过:0、5后面是否有0,2、7后面是否有5,这样一次遍历即可。

代码

分类讨论

class Solution {
public:
    int minimumOperations(string num) {
        int ans=0;
        for (char& c:num){
            if (c!='0'){
                ans++;
            }
        }
        ans=min(ans,check(num,'0','0'));
        ans=min(ans,check(num,'2','5'));
        ans=min(ans,check(num,'5','0'));
        ans=min(ans,check(num,'7','5'));
        return ans;
    }

    int check(string& num, char a, char b){
        bool flaga=false,flagb=false;
        int count=0;
        for (int i=num.length()-1;i>=0;i--){
            if (!flagb){
                if (num[i]==b){
                    flagb=true;
                }else{
                    count++;
                }
            }else if (!flaga){
                if (num[i]==a){
                    flaga=true;
                    break;
                }
                else{
                    count++;
                }
            }
        }
        if (flaga&&flagb){
            return count;
        }else{
            return INT_MAX;
        }
    }
};

哈希表优化

class Solution {
public:
    int minimumOperations(string num) {
        vector<int> arr(10);
        int n=num.length();
        for (int i=n-1;i>=0;i--){
            //判断0或5后面是否有0
            if (num[i]=='0'||num[i]=='5'){
                if (arr[0]){
                    return n-i-2;
                }
            }
            //判断2或7后面是否有5
            if (num[i]=='2'||num[i]=='7'){
                if (arr[5]){
                    return n-i-2;
                }
            }
            //加入哈希表
            arr[num[i]-'0']=1;
        }
        //判断是否含有0
        return arr[0]?n-1:n;
    }
};

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值