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

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

相关推荐
问君能有几多愁~16 小时前
C++ 数据结构复习笔记
数据结构·c++·笔记
至乐活着16 小时前
深入解析跳表SkipList:原理、实现与性能优化实战
数据结构·算法·跳表·skiplist·java实现
tntxia16 小时前
C++ 基础教程:从入门到精通
c++
Drone_xjw16 小时前
从 GDB 到 CDB:C/C++ 程序调试的两把“手术刀”
c语言·开发语言·c++
Jerry17 小时前
LeetCode 383. 赎金信
算法
ai产品老杨17 小时前
H264 H265视频分析常见问题和排查清单
人工智能·算法·音视频
Jerry18 小时前
LeetCode 454. 四数相加 II
算法
可编程芯片开发18 小时前
基于CPS-SPWM链式STATCOM系统在电压不平衡环境下控制策略的simulink建模与仿真
算法
Jerry19 小时前
LeetCode 202. 快乐数
算法
hans汉斯19 小时前
基于改进交叉熵损失函数与Transformer的心电信号高风险分类研究
功能测试·深度学习·算法·yolo·目标检测·分类·transformer