【leetcode 详解】生成特殊数字的最少操作【中等】(C++思路精析)

题目见下:

测试数据:

解题思路笔记:

最初拿到这道题是很蒙的,联想不到什么数据结构的模型(肯定是笔者积累太少了),甚至惯性地想怎么实现"删除数字"的操作:在原字符串中抽出一个字符然后将剩余数字按原顺序拼接?

看着看着下面的测试数据,我突然意识到,能整除25的数确实很特殊,即若长度足够,则必然以【00,50, 25, 75】来结尾,这样一来,未知长度的字符串问题,就转化为了:专注于找可以放在结尾的两字符的问题。

进一步观察题目要求可以发现,既然咱们要的就是 "最小删除个数" 这么个结果,中间过程怎么实现都行,也就是不必按题目表述的 "删除一个字符,检查是否可整除25" 介么生硬地来。这大概也是像笔者一样的编程初学者容易陷入的误区,实现过程的思路总是跟着题目叙述跑,但优质的(时空复杂度较低)的解法往往需要明确问题核心,创意性地从新的角度切入。

//更多创意性解法,这里推荐文章

PTA 7-4 列车调度(C/ C++ 一个数组就好啦!)-CSDN博客

最后,附上AC代码:

cpp 复制代码
class Solution {
private:
	void Myfunc(string num, int cur0, char c1, char c2, int &re)
	{
		int len = num.length();
		int help1=len, help2=len;
		while(1)
    	{
    		if(help1 >= cur0 ) help1 = num.rfind(c1, help1-1);
			if(help2 >= cur0 ) help2 = num.rfind(c2, help2-1);
			if(help1 < cur0 && help2 < cur0) break;
            //说明:调试过程中发现,num.npos其实就等于 -1,可以进行整数比较
		}
		if(help1 == num.npos && help2 == num.npos)
		{
			if(cur0 != num.npos && c1 == '0') re = len - 1;
            //只有当末尾数字为0时才进行这部操作
		} 
		else
		{
			if(help1 != num.npos) re = min(re, len-2-help1);
			if(help2 != num.npos) re = min(re, len-2-help2);
		} 
	}
	
public:
    int minimumOperations(string num) {
    	if(!num.compare("0")) return 0;//特殊情况处理
    	int re = num.length();
    	int cur0 = num.rfind('0'), cur5 = num.rfind('5');
    	if(cur0 != num.npos)
    	{
			Myfunc(num, cur0, '0', '5', re);
		}
    	if(cur5 != num.npos)
    	{
    		Myfunc(num, cur5, '2', '7', re);
		}
		return re;
    }
};

~希望对你有启发~

相关推荐
王老师青少年编程1 分钟前
csp信奥赛C++高频考点专项训练之贪心算法 --【排序贪心】:拼数
c++·算法·贪心·csp·信奥赛·排序贪心·拼数
程序猿编码6 分钟前
给Linux程序穿“隐身衣”——ELF运行时加密器全解析(C/C++代码实现)
linux·c语言·c++·网络安全·elf·内存安全
炽烈小老头18 分钟前
【 每天学习一点算法 2026/04/21】螺旋矩阵
学习·算法
John_ToDebug27 分钟前
从 Win10 到 Win11 22H2+:任务栏美化中的“蒙版”和“Hover 色块”渲染原理解析
c++·chrome·windows
原来是猿28 分钟前
Linux线程同步与互斥(三):POSIX信号量与环形队列生产者消费者模型
linux·运维·服务器·开发语言
未来转换33 分钟前
基于A2A协议的生产应用实践指南(Java)
java·开发语言·算法·agent
Rust语言中文社区35 分钟前
【Rust日报】Clone:像进程一样 fork 虚拟机的 Rust KVM VMM
开发语言·后端·rust
求知也求真佳39 分钟前
S02|工具使用:让 Agent 真正会干活,添加工具
开发语言·agent
Dwzun42 分钟前
基于Java+SpringBoot+Vue的校园二手物品置换系统设计与实现【附源码+文档+部署视频+讲解】
java·开发语言·spring boot
charlie1145141911 小时前
嵌入式Linux驱动开发(3)——内核模块机制 - Linux 的插件系统
linux·运维·开发语言·驱动开发·嵌入式硬件·学习