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,代表找不到

加油

相关推荐
van叶~8 分钟前
算法妙妙屋-------1.递归的深邃回响:二叉树的奇妙剪枝
c++·算法
knighthood200118 分钟前
解决:ros进行gazebo仿真,rviz没有显示传感器数据
c++·ubuntu·ros
半盏茶香1 小时前
【C语言】分支和循环详解(下)猜数字游戏
c语言·开发语言·c++·算法·游戏
小堇不是码农1 小时前
在VScode中配置C_C++环境
c语言·c++·vscode
Jack黄从零学c++1 小时前
C++ 的异常处理详解
c++·经验分享
亦枫Leonlew1 小时前
微积分复习笔记 Calculus Volume 1 - 4.7 Applied Optimization Problems
笔记·数学·微积分·1024程序员节
劲夫学编程2 小时前
leetcode:杨辉三角
算法·leetcode·职场和发展
师太,答应老衲吧6 小时前
SQL实战训练之,力扣:2020. 无流量的帐户数(递归)
数据库·sql·leetcode
捕鲸叉6 小时前
创建线程时传递参数给线程
开发语言·c++·算法
A charmer7 小时前
【C++】vector 类深度解析:探索动态数组的奥秘
开发语言·c++·算法