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、总结

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

相关推荐
Σίσυφος190011 分钟前
RANSAC算法原理与应用
算法
我星期八休息27 分钟前
MySQL数据可视化实战指南
数据库·人工智能·mysql·算法·信息可视化
初次见面我叫泰隆32 分钟前
Qt——1、初识Qt
开发语言·c++·qt
程序员-King.35 分钟前
day144—递归—平衡二叉树(LeetCode-110)
算法·leetcode·二叉树·递归
老鼠只爱大米37 分钟前
LeetCode经典算法面试题 #739:每日温度(单调栈、动态规划等多种实现方案详解)
算法·leetcode·面试·动态规划·单调栈·每日温度
老鼠只爱大米44 分钟前
LeetCode经典算法面试题 #394:字符串解码(递归、双栈、迭代构建等五种实现方案详解)
算法·leetcode·面试·递归··字符串解码
兵哥工控1 小时前
MFC 对话框Alt+F4退出程序实例
c++·mfc
独自破碎E1 小时前
【回溯+剪枝】字符串的排列
算法·机器学习·剪枝
Smart-佀1 小时前
FPGA入门:CAN总线原理与Verilog代码详解
单片机·嵌入式硬件·物联网·算法·fpga开发
王老师青少年编程1 小时前
2024年9月GESP真题及题解(C++七级): 小杨寻宝
c++·题解·真题·gesp·csp·七级·小杨寻宝