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

今天的力扣每日一题比较有意思,这个题的话还是需要有一些编程思维或者说数学思维才能想到的(应该需要每天自己推理实践日积月累),当然这个题如果在比赛中的话不算难题,顶多是:> 签到题 && <= 中档题,好了来一起看看吧

首先呢阅览一遍题目后我们可以发现的是,如果num中包含了一个'0',那么ans最多是n - 1(n是num长度),因为呢除了这个'0'其他全删了么

在来观察,被25整除,思考思考,你会发现25 * (1 ~ n)中的数他的后两位尾数是{25,50,75,00},只要能发现这个规律,那这道题也就结束了,当然想不到也没关系,慢慢积累

那接下来就是两个指针i和j去遍历就行了,把{25,50,75,00}存到哈希表里面,如果key = num[i] + num[j]在哈希表里面找到了,就去更新一次ans的值

代码:

cpp 复制代码
class Solution {
public:
    int minimumOperations(string num) {
        int n = num.size(),ans = 0x3f3f3f3f,flag = 0;
        if(n == 1 && num[0] != '0') return 1;
        else if(n == 1 && num[0] == '0') return 0;
        unordered_map<string,int> hs;
        hs["00"] = 1,hs["25"] = 1,hs["50"] = 1,hs["75"] = 1;
        if(num.find('0') != string::npos) ans = min(ans,n - 1),flag = 1;
        for(int i=0;i<n;i++){
            for(int j=i+1;j<n;j++){
                string key = to_string(num[i] - '0') + to_string(num[j] - '0');
                // cout << key << endl;
                if(hs.count(key)){
                    // cout << key << endl;
                    ans = min(ans,n - i - 2);
                    flag = 1;
                }
            }
        }
        if(!flag) ans = n;
        return ans;
    }
};

这个地方解释一个,像哈希表或者set之类用find函数一般找不到都是返回最后的那个空指针也就是.end(),在字符串中如果find函数没找到的话是返回string::npos的,也就是-1,代表找不到

加油

相关推荐
C++ 老炮儿的技术栈11 分钟前
什么是函数重载?为什么 C 不支持函数重载,而 C++能支持函数重载?
c语言·开发语言·c++·qt·算法
猪八戒1.029 分钟前
C++ 回调函数和Lambda表达式
c++
源远流长jerry1 小时前
匿名函数lambda、STL与正则表达式
c++
MarkHard1231 小时前
Leetcode (力扣)做题记录 hot100(62,64,287,108)
算法·leetcode·职场和发展
王RuaRua1 小时前
[数据结构]5. 栈-Stack
linux·数据结构·数据库·链表
tan180°2 小时前
Linux进程信号处理(26)
linux·c++·vscode·后端·信号处理
一只鱼^_2 小时前
牛客练习赛138(首篇万字题解???)
数据结构·c++·算法·贪心算法·动态规划·广度优先·图搜索算法
寒小松2 小时前
Problem E: List练习
java·数据结构·list
李匠20243 小时前
C++GO语言微服务之Dockerfile && docker-compose②
c++·容器
2301_803554523 小时前
c++和c的不同
java·c语言·c++