【字符串】剑指Offer 05.替换空格(C/C++/Java/Python/Js)

news2024/11/15 11:34:46

剑指Offer 05.替换空格

  • 1 题目
  • 2 思路--双指针法
  • 3 代码
    • 3.1 C++版本
    • 3.2 C版本
    • 3.3 Java版本
    • 3.4 Python3版本
    • 3.5 JavaScript版本
  • 4 总结


1 题目


题源链接

请实现一个函数,把字符串 s 中的每个空格替换成"%20"。

示例 1:

输入:s = “We are happy.”
输出:“We%20are%20happy.”

限制:

0 <= s 的长度 <= 10000


2 思路–双指针法


首先扩充数组到每个空格替换成"%20"之后的大小。

然后从后向前替换空格,也就是双指针法,过程如下:
i指向新长度的末尾,j指向旧长度的末尾。
在这里插入图片描述
动画演示

其实很多数组填充类的问题,都可以先预先给数组扩容带填充后的大小,然后在从后向前进行操作。

这么做有两个好处:

  1. 不用申请新数组。
  2. 从后向前填充元素,避免了从前向后填充元素时,每次添加元素都要将添加元素之后的所有元素向后移动的问题。

3 代码


3.1 C++版本


class Solution {
public:
    string replaceSpace(string s) { //双指针法
        int cnt = 0;    //记录空格个数
        int lenOld = s.size();
        for (int i = 0; i < s.size(); i++)
            if (s[i] == ' ')
                cnt++;
        //  扩充s为空格替换成%20之后的大小
        s.resize(s.size() + cnt * 2);
        int lenNew = s.size();
        for (int i = lenNew - 1, j = lenOld - 1; j < i; i--, j--) {
            if (s[j] != ' ')
                s[i] = s[j];
            else {
                s[i--] = '0';
                s[i--] = '2';
                s[i] = '%';
            }
        }
        return s;
    }
};

3.2 C版本


char* replaceSpace(char* s){
    //统计空格数量
    int count = 0;
    int len = strlen(s);
    for (int i = 0; i < len; i++) {
        if (s[i] == ' ') {
            count++;
        }
    }

    //为新数组分配空间
    int newLen = len + count * 2;
    char* result = malloc(sizeof(char) * newLen + 1);
    //填充新数组并替换空格
    for (int i = len - 1, j = newLen - 1; i >= 0; i--, j--) {
        if (s[i] != ' ') {
            result[j] = s[i];
        } else {
            result[j--] = '0';
            result[j--] = '2';
            result[j] = '%';
        }
    }
    result[newLen] = '\0';

    return result;
}

3.3 Java版本


public String replaceSpace(String s) {
    if(s == null || s.length() == 0){
        return s;
    }
    //扩充空间,空格数量2倍
    StringBuilder str = new StringBuilder();
    for (int i = 0; i < s.length(); i++) {
        if(s.charAt(i) == ' '){
            str.append("  ");
        }
    }
    //若是没有空格直接返回
    if(str.length() == 0){
        return s;
    }
    //有空格情况 定义两个指针
    int left = s.length() - 1;//左指针:指向原始字符串最后一个位置
    s += str.toString();
    int right = s.length()-1;//右指针:指向扩展字符串的最后一个位置
    char[] chars = s.toCharArray();
    while(left>=0){
        if(chars[left] == ' '){
            chars[right--] = '0';
            chars[right--] = '2';
            chars[right] = '%';
        }else{
            chars[right] = chars[left];
        }
        left--;
        right--;
    }
    return new String(chars);
}

3.4 Python3版本


class Solution:
    def replaceSpace(self, s: str) -> str:
        # method 1 - Very rude
        return "%20".join(s.split(" "))

        # method 2 - Reverse the s when counting in for loop, then update from the end.
        n = len(s)
        for e, i in enumerate(s[::-1]):
            print(i, e)
            if i == " ":
                s = s[: n - (e + 1)] + "%20" + s[n - e:]
            print("")
        return s

3.5 JavaScript版本


/**
 * @param {string} s
 * @return {string}
 */
 var replaceSpace = function(s) {
   // 字符串转为数组
  const strArr = Array.from(s);
  let count = 0;

  // 计算空格数量
  for(let i = 0; i < strArr.length; i++) {
    if (strArr[i] === ' ') {
      count++;
    }
  }

  let left = strArr.length - 1;
  let right = strArr.length + count * 2 - 1;

  while(left >= 0) {
    if (strArr[left] === ' ') {
      strArr[right--] = '0';
      strArr[right--] = '2';
      strArr[right--] = '%';
      left--;
    } else {
      strArr[right--] = strArr[left--];
    }
  }

  // 数组转字符串
  return strArr.join('');
};

4 总结

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

By – Suki 2023/2/3

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/196679.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

重磅!马斯克再抛特斯拉股票,去年中国市场份额首次下滑

特斯拉的走势&#xff0c;正在凸显智能电动汽车市场格局的新变化。 几周前&#xff0c;特斯拉首席执行官埃隆马斯克出售了价值近36亿美元的股票&#xff0c;就在三周前&#xff0c;这家全球智能电动汽车领头羊宣布未能实现年度交付目标&#xff08;少了近2.2万辆&#xff09;。…

windows下同时安装mysql5.5和mysql8.0.32

一、安装mysql8.0.32 我先安装的是mysql5.5&#xff0c;如&#xff1a;MySQL5.5安装教程SQLyog安装_柒七的博客-CSDN博客_mysql5.5的安装步骤 1.下载解压 https://dev.mysql.com/downloads/mysql/ 2.创建配置 下载完后&#xff0c;建议解压到一个没有中文的路径&#xff0…

Vue使用ElementUI动态修改table单元格背景颜色或文本颜色

前言 今天遇到一个场景&#xff0c;表格行属性的字典项要针对不同的状态&#xff0c;展示不同的文本颜色&#xff0c;如下图所示&#xff1a; 账号状态这一栏&#xff0c;如果是正常就展示以绿色字体展示&#xff0c;如果是禁用就以红色颜色展示 针对这个需求&#xff0c;我第…

u盘文件被电脑杀毒软件删掉了,怎么才能恢复

案例分享&#xff1a;【我的u盘中毒文件被电脑杀毒软件删掉了&#xff0c;怎么才能恢复啊&#xff1f;&#xff1f;里面有很重要的资料。求高手指点&#xff01;急&#xff01;&#xff01;&#xff01;】——虽然u盘能够存储数据&#xff0c;且体积小巧便于携带&#xff0c;但…

算法:(十二)排序

文章目录12.1 计数排序面试题75&#xff1a;数组相对排序12.2 快速排序面试题76&#xff1a;数组中第k大的数12.3 归并排序面试题77&#xff1a;链表排序面试题78&#xff1a;合并排序链表12.1 计数排序 面试题75&#xff1a;数组相对排序 题目&#xff1a; 给定两个数组&…

UNIAPP实战项目笔记57 发送手机验证码 接入短信SDK

UNIAPP实战项目笔记57 发送手机验证码 接入短信SDK 注册时候需要发送验证 通过验阿里云或腾讯云等短信sdk供应商 实际案例图片 后端接口文件 index.js var express require(express); var router express.Router(); var connection require(../db/sql.js); var user requi…

龙芯处理器7A2000桥片iTOP-3A5000开发板

龙芯处理器7A2000桥片iTOP-3A5000开发板 主要参数 处理器: 龙芯3A5000 主频: 2.3GHz-2.5GHz 桥片: 7A2000 内存: 8GB、16GB DDR4带ECC纠错&#xff08;配置可选&#xff09; 系统: Loongnix 典型功耗: 35W 核心板: 16层 底板: 4层 核心板参数 尺寸: 125*95mm C…

力扣二叉树篇题

题目说明B树如果为空树则不是A树的子结构 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode(int x) { val x; }* }*/ class Solution {public boolean isSubStructure(TreeNode A,…

VMware ESXi 7.0 Update 3j 更新发布,修复已知问题

VMware ESXi 7.0 Update 3j Standard & All Custom Image for ESXi 7.0 U3j Install CD 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-esxi-7-u3/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;www.sysin.org 产品简介…

迁移mysql数据库到opengauss

一、安装chameleon工具1.下载源码git clone gitgitee.com:opengauss/openGauss-tools-chameleon.git2.创建Python虚拟环境并激活安装依赖&#xff1a;yum install mysql-devel gcc gcc-devel python-develpython3 -m venv venvsource venv/bin/activate3.进入代码的目录&#x…

CAD转PDF其实很简单,掌握这4种方法就可以

Hello&#xff0c;大家好&#xff0c;这里是建模助手&#xff01; CAD作为一种绘图格式&#xff0c;在工业设计领域发挥着不可替代的作用&#xff0c;一般有DXF、DWG两种常见的格式&#xff0c;但是一般需要在电脑中安装特定软件才能打开此类格式的文件。 因此大多数人在给别…

网站表单实时通知 销售线索不错漏

对于企业来说&#xff0c;在进行产品发布或营销推广时&#xff0c;都需要大量的信息收集汇总。此时都会用到表单功能&#xff0c;网站上的表单功能应用非常广泛&#xff0c;可做信息收集效果&#xff0c;可做付费预约效果等&#xff0c;而如果希望能实时推送表单收集到的数据&a…

AQS(AbstractQueuedSynchronizer)是什么?

目录简介原理概览资源的共享方式独占&#xff08;Exclusive&#xff09;共享&#xff08;Shared&#xff09;模板方法模式在AQS中的应用经典应用ReentrantLockSemaphore简介 AQS全称AbstractQueuedSynchronizer&#xff0c;位于java.util.concurrent.locks包下&#xff0c;它是…

Kubernetes (k8s)在企业项目中的重点应用场景以及云原生和云架构的原理

Kubernetes &#xff08;k8s&#xff09;在企业项目中的重点应用场景以及云原生和云架构的原理。 Kubernetes&#xff0c;简称 K8s&#xff0c;是用 8 代替中间 8 个字符 “ubernete” 而成的缩写&#xff0c;是一个开源的&#xff0c;用于管理云平台中多个主机上的容器化的应…

Allegro因为DRC报错无法使用走线居中命令的解决办法

Allegro因为DRC报错无法使用走线居中命令的解决办法 在用Allegro做PCB设计的时候,走线居中是非常实用的功能 但是这个功能只能在走线居中不会产生DRC的使用。 如果居中后仍然存在DRC,比如间距,等长等等DRC,如下图: 使用居中命令就会出现报错,如图,因为居中后线距离孔的…

图文详解Linux中的火墙策略优化

目录 前言 一、火墙管理工具切换 二、iptables 的使用 三、火墙默认策略 四、firewalld的使用 1、firewalld的开启 2、关于firewalld的域 3、关于firewalld的设定原理及数据存储 4、firewalld的管理命令 5、firewalld的高级规则 6、firewalld中的NAT 总结 前言 火…

【软件测试】性能测试面试题分析与回答,你的优势不止这些......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 软件测试这一岗已悄…

Java原型模式以及引用拷贝与对象拷贝问题

目录基本数据类型&#xff0c;引用数据类型&#xff0c;String引用拷贝对象拷贝浅拷贝深拷贝原型模式基本数据类型&#xff0c;引用数据类型&#xff0c;String 这里为了更好的理解栈&#xff0c;堆的指向关系&#xff0c;Java传值&#xff0c;传引用问题&#xff0c;我找来一…

全网最详细地介绍mybatis-plus框架

文章目录1. 简介2. 特性3. 支持数据库4. 框架结构5. 开始使用5.1 数据源5.2 初始化工程6. 总结之前使用mybatis框架时&#xff0c;需要写大量的xml配置文件&#xff0c;维护起来比较繁琐。现在使用mybatis-plus&#xff0c;若是简单的curd操作&#xff0c;可以不用写xml文件&am…

maxwell解析mysql的binlog数据并保存到kafka使用

通过maxwell来实现binlog的实时解析&#xff0c;实现数据的实时同步 1、mysql创建一个maxwell用户 为mysql添加一个普通用户maxwell&#xff0c;因为maxwell这个软件默认用户使用的是maxwell这个用户&#xff0c; 进入mysql客户端&#xff0c;然后执行以下命令&#xff0c;进…