3174、清除数字

3174、[简单] 清除数字

1、题目描述

给你一个字符串 s 。你的任务是重复以下操作删除 所有 数字字符:

  • 删除 第一个数字字符 以及它左边 最近非数字 字符。

请你返回删除所有数字字符以后剩下的字符串。

2、解题思路

  1. 遍历字符串

    • 我们需要逐个遍历字符串中的每个字符,找到数字字符,并删除其左侧最近的非数字字符。
  2. 双指针法

    • 我们可以使用两个指针 left 和 right 来实现遍历和删除的过程:
      • right 用于遍历字符串 s
      • left 用于构造删除后的新字符串,逐步替换字符。
  3. 处理逻辑

    • 当我们遇到一个数字字符时,删除左侧最近的非数字字符,这可以通过将 left 指针左移一位实现。

    • 当遇到非数字字符时,将其放到新的位置上,并移动 left 指针。

  4. 最后清理字符串

    • 遍历结束后,使用 erase 函数删除字符串中多余的字符,最终得到所需结果。

3、代码实现

复制代码
class Solution {
public:
    string clearDigits(string s) {
        int n = s.size(); // 获取字符串的长度
        // 定义两个指针, left 用于构造新字符串, right用于遍历原字符串
        int left = 0, right = 0;

        // 使用双指针法遍历字符串
        while (right < n) {
            // 如果当前字符是数字
            if (s[right] >= '0' && s[right] <= '9') {
                // 如果 left 不为 0,表示有可以删除的非数字字符
                if (left != 0) {
                    // 删除数字左侧最近的非数字字符
                    left--;
                }
            } else {
                // 如果当前字符是非数字字符,将其放到新位置上
                s[left++] = s[right];
            }
            right++; // 移动右指针
        }

        // 删除从 left 开始的多余字符
        s.erase(left);

        // 返回处理后的字符串
        return s;
    }
};

4、复杂度分析

  • 时间复杂度 :O(n),其中 n 是字符串的长度。我们只遍历字符串一次。

  • 空间复杂度:O(1),只使用了常数级别的额外空间来存储指针。

5、总结

这个问题通过双指针法实现对字符串的遍历和处理,核心在于如何高效地删除数字字符及其左侧相邻的非数字字符。通过对指针的巧妙控制,我们能够在一次遍历中完成所有操作,并且不需要额外的空间复杂度。

相关推荐
智者知已应修善业13 分钟前
【51单片机8位数码管动态显示日期小数点风格】2023-11-13
c++·经验分享·笔记·算法·51单片机
智者知已应修善业14 分钟前
【51单片机有三个LED 分别第一个灯闪三下 再到第二个灯又闪三下 再到第三个灯又闪三下 就这样循环程序】2023-11-16
c++·经验分享·笔记·算法·51单片机
小L~~~2 小时前
基于贪心策略的混合遗传算法求解01背包问题
python·算法
洛水水2 小时前
【力扣100题】53.最长回文子串
算法·leetcode·职场和发展
jieyucx2 小时前
Go 语言 sort 包详解:从基础排序到自定义排序(含底层原理+零基础看懂)
算法·golang·排序算法·sort
叁散3 小时前
ESP32 LCD1602显示实验报告
算法
过期动态3 小时前
【LeetCode 热题 100】盛最多水的容器
java·数据结构·spring boot·算法·leetcode·spring cloud·职场和发展
凌波粒3 小时前
LeetCode--700.二叉搜索树中的搜索(二叉树)
算法·leetcode·职场和发展
君为先-bey3 小时前
LeMiCa——基于扩散模型的高效视频生成的词典序最小化路径缓存
python·算法·机器学习·扩散模型