当前位置: 首页 > news >正文

[M模拟] lc2844. 生成特殊数字的最少操作(简单易错+分类讨论+代码优化技巧)

文章目录

    • 1. 题目来源
    • 2. 题目解析

1. 题目来源

链接:2844. 生成特殊数字的最少操作

2. 题目解析

模拟题目,看着很简单,但是如何把代码写对、写的效率高,还是需要些技巧的。

思路:

  • 分类讨论:
    • 00 这种情况肯定不会出现,因为不包含前导0。至少也是个 xx00。
    • 00、25、50、75 这四种情况属于两位能被 25 整除的。
    • 0 属于一位能被 25 整除的。
    • 全部删除,属于没有找到合法条件的全部删除。
  • 单独一个 0 不是很好处理,可以优先特判去处理。
  • 剩余的 00、25、50、75 这类,可以倒序遍历,采用两次遍历的方式:
    • 如果第一个是 0,那么需要再找到前面的 0 或者 5。此时针对下标 0 已经是一个最优情况了。
    • 如果第一个是 5,同理向前找 2、7 即可。
  • 最终统计下结果即可。
  • 上述方法为两次遍历。会对 num 遍历多遍。

关于 1次遍历的方式,也是我一开始最先想的方式,参考灵神题解绘图:
在这里插入图片描述
根据该图,在从右往左遍历的过程中:

  • 在之前找到 0 的情况下,如果当前数字 num[i] 是 0 或者 5,则立刻返回 n−i−2。
  • 在之前找到 5 的情况下,如果当前数字 num[i] 是 2 或者 7,则立刻返回 n−i−2。
  • 否则,如果 num[i] 是 0,标记我们找到了 0。
  • 否则,如果 num[i] 是 5,标记我们找到了 5。
  • 如果循环中没有返回,则最后返回 n 或者 n−1,取决于我们是否找到了 0。

  • 时间复杂度 O ( n ) O(n) O(n)
  • 空间复杂度 O ( 1 ) O(1) O(1)

两次遍历:

class Solution {
public:int minimumOperations(string num) {int n = num.size();int res = n;for (int i = 0; i < n; i ++ ) {if (num[i] == '0') {res = n - 1;break;}}bool has_5 = false, has_0 = false;for (int i = n - 1; ~i; i -- ) {int t = n;if (has_5 == false && i > 0 && num[i] == '5') {for (int j = i - 1; ~j; j -- ) {if (num[j] == '2' || num[j] == '7') {t = n - j - 1 - 1;has_5 = true;break;}}}if (has_0 == false && i > 0 && num[i] == '0') {for (int j = i - 1; ~j; j -- ) {if (num[j] == '0' || num[j] == '5') {t = n - j - 1 - 1;break;}}}res = min(res, t);if (has_0 && has_5) return res;}return res;}
};

一次遍历:

class Solution {
public:int minimumOperations(string num) {int n = num.size();bool f_0 = false, f_5 = false;for (int i = n - 1; i >= 0; i -- ) {char c = num[i];if (f_0 && (c == '0' || c == '5') || (f_5 && (c == '2' || c == '7'))) {return n - i - 2;}if (c == '0') f_0 = true;else if (c == '5') f_5 = true;}return n - f_0;}
};

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • QtCMake工程提升类后找不到头文件
  • docker拉取错误解决
  • 【网络】socket和udp协议
  • Istio_01_Istio初识
  • Git、Gitlab以及分支管理
  • Spring Data Redis 报错 WRONGPASS invalid username-password pair问题解决
  • vue 进入页面自动刷新并且只刷新一次
  • DevExpress WinForms自动表单布局,创建高度可定制用户体验(二)
  • 多角度解析高防CDN防御DDOS及CC攻击
  • python:面向对象
  • 10.11和10.8那个大(各种ai的回答)
  • C++合作开发项目:美术馆1.0
  • vue3 组件通信 mitt
  • el-upload照片墙自定义上传多张图片(手动一次性上传多张图片)包含图片回显,删除
  • 在 Windows 上安装 PostgreSQL
  • 【Leetcode】104. 二叉树的最大深度
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • canvas 高仿 Apple Watch 表盘
  • create-react-app做的留言板
  • CSS中外联样式表代表的含义
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • Theano - 导数
  • 测试开发系类之接口自动化测试
  • 猴子数据域名防封接口降低小说被封的风险
  • 离散点最小(凸)包围边界查找
  • 前端设计模式
  • 数据科学 第 3 章 11 字符串处理
  • 字符串匹配基础上
  • puppet连载22:define用法
  • #162 (Div. 2)
  • #DBA杂记1
  • #includecmath
  • #数学建模# 线性规划问题的Matlab求解
  • $GOPATH/go.mod exists but should not goland
  • (1)常见O(n^2)排序算法解析
  • (20)docke容器
  • (3)选择元素——(17)练习(Exercises)
  • (4)事件处理——(7)简单事件(Simple events)
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (LLM) 很笨
  • (Matlab)使用竞争神经网络实现数据聚类
  • (翻译)terry crowley: 写给程序员
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (接口自动化)Python3操作MySQL数据库
  • (一)UDP基本编程步骤
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • (转)用.Net的File控件上传文件的解决方案
  • (转载)PyTorch代码规范最佳实践和样式指南
  • .env.development、.env.production、.env.staging
  • .java 9 找不到符号_java找不到符号
  • .Net的C#语言取月份数值对应的MonthName值
  • .net解析传过来的xml_DOM4J解析XML文件