剑指Offer05.替换空格

剑指Offer05.替换空格

目录

  • 剑指Offer05.替换空格
    • 题目描述
    • 解法一:遍历添加
    • 解法二:原地修改

题目描述

请实现一个函数,把字符串s中的每个空格都替换成“%20”。
在这里插入图片描述

解法一:遍历添加

由于每次替换都要把一个空格字符变成三个字符,所以我们可以选择使用字符数组方便地进行替换

建立字符数组的长度为s字符串长度的3倍,这样可以保证就算字符串全是空格,也可以容纳所有替换后的字符串

过程如下

  • 1、获得字符串s的长度length
  • 2、创建字符数组arr,长度为length*3
  • 3、初始化size0size表示替换后的字符串长度
  • 4、从左到右遍历字符串s
    • 获得当前s的当前字符c
    • 如果字符c是空格,则令arr[size]='%',arr[size+1]='2',arr[size+2]=0,并将size的值加3
    • 如果字符c不是空格,则令arr[size]=c,并将size的值加1
  • 5、遍历结束后,size的值等于替换后的字符串的长度,从arr的前size个字符创建新字符串,并返回
    public String replaceSpace(String s) {int length = s.length();char[] arr = new char[length*3];int size = 0;for(int i=0;i<length;i++){char c = s.charAt(i);if(c==' '){arr[size++]='%';arr[size++]='2';arr[size++]='0';}else{arr[size++] = c;}}return new String(arr,0,size);}

解法二:原地修改

在解法一中,我们需要额外使用一个数组空间,这样导致我们的空间复杂度为O(n)

我们思考一种不需要额外空间的方法,很明显,我们需要使用双指针

在使用双指针之前,我们需要先扩充一下原字符串的长度

算法过程如下:

  • 1、初始化:记录空格数量count,字符串s的长度length
  • 2、统计空格数量:遍历s,遇到空格则count++
  • 3、修改字符串s的长度:添加完%20后的字符串长度应为length+2*count
  • 4、倒序遍历修改:i指针指向原字符串的末尾,j指针指向新字符串的末尾,当i==j时跳出循环
    • s[i]不为空格时,执行s[i]=s[j]
    • 当s[i]为空格时,将字符串闭区间[j-2,j]的元素修改为“%20”,同时j-=2;
  • 5、返回已经修改好的字符串
    public String replaceSpace(String s) {//判空进行剪枝操作if(s==null||s.length()==0){return s;}//给字符扩充空间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);}

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

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

相关文章

Godot 4 源码分析 - 碰撞

碰撞功能应该是一个核心功能&#xff0c;它能自动产生相应的数据&#xff0c;比如目标对象进入、离开本对象的检测区域。 基于属性设置&#xff0c;能碰撞的都具备这样的属性&#xff1a;Layer、Mask. 在Godot 4中&#xff0c;Collision属性中的Layer和Mask属性是用于定义碰撞…

Unity 编辑器选择器工具类Selection 常用函数和用法

Unity 编辑器选择器工具类Selection 常用函数和用法 点击封面跳转下载页面 简介 在Unity中&#xff0c;Selection类是一个非常有用的工具类&#xff0c;它提供了许多函数和属性&#xff0c;用于操作和管理编辑器中的选择对象。本文将介绍Selection类的常用函数和用法&#xff…

伊语IM即时通讯源码/im商城系统/纯源码IM通讯系统安卓+IOS前端纯原生源码

伊语IM即时通讯源码/im商城系统/纯源码IM通讯系统安卓IOS前端纯原生源码&#xff0c; 后端是java源码。

2.4 网络安全新技术

数据参考&#xff1a;CISP官方 目录 云计算安全大数据安全移动互联网安全物联网安全工业互联网安全 一、云计算安全 1、云计算定义 云计算是指通过网络访问可扩展的、灵活的物理或虚拟共享资源池&#xff0c;并按需自助获取和管理资源的模式。在云计算中&#xff0c;计算资…

深度学习之双线性插值

1、单线性插值 单线性插值是一种用于估计两个已知数据点之间未知点的方法。它基于线性关系&#xff0c;通过计算目标位置的值&#xff0c;使用已知点之间的线性函数进行插值。这在图像处理中常用于放缩、旋转等操作&#xff0c;计算简单&#xff0c;产生平滑结果&#xff0c;但…

小白也能懂!业务中台与数据中台究竟是什么?

大家好&#xff0c;今天我们要讨论的是业务中台与数据中台&#xff0c;或许你对这些名词还不太熟悉&#xff0c;但别担心&#xff0c;接下来我将为你详细解释这两个概念&#xff0c;并且用通俗易懂的语言来解释它们。 业务中台是什么&#xff1f; 首先&#xff0c;让我们来了解…

ubuntu搭建wifi热点,共享网络(x86、arm相同)

目录 1 首先检查网络管理器服务是否开启 &#xff08;ubuntu需要界面&#xff09; 2 创建并配置需要共享的wifi 首先&#xff0c;明确下这篇文章说的是啥&#xff0c;是为了在ubuntu系统的电脑上&#xff0c;搭建一个wifi热点&#xff0c;供其他移动设备连接上网。就像你…

java实现钉钉群机器人@机器人获取信息后,机器人回复(机器人接收消息)

1.需求 鉴于需要使用钉钉群机器人回复&#xff0c;人们提出的问题&#xff0c;需要识别提出的问题中的关键词&#xff0c;后端进行处理实现对应的业务逻辑 2.实现方式 用户群机器人&#xff0c;附带提出的问题&#xff0c;后端接收消息后识别消息内容&#xff0c;读取到关键…

第3章 数据和C

本章介绍以下内容&#xff1a; 关键字&#xff1a;int 、short、long、unsigned、char、float、double、_Bool、_Complex、_Imaginary 运算符&#xff1a;sizeof() 函数&#xff1a;scanf() 整数类型和浮点数类型的区别 如何书写整型和浮点型常数&#xff0c;如何声明这些类型的…

ImagXpress .NET Standard Crack

ImagXpress .NET Standard Crack ImagXpress SDK可让您快速将图像功能添加到Windows应用程序中。您可以快速开发需要复杂成像任务的应用程序&#xff0c;用于文档成像、照片处理或医疗应用程序&#xff0c;同时专注于您的程序的独特需求。ImagXpress是开发涉及图像的专业应用程…

Windows下JDK安装与环境变量配置

文章目录 每日一句正能量前言安装步骤配置环境变量验证环境变量是否配置成功后记 每日一句正能量 生命,就像一场永无休止的苦役,不要惧怕和拒绝困苦,超越困苦,就是生活的强者。任何经历都是一种累积,累积的越多,人就越成熟;经历的越多,生命就越有厚度。 本来不想写JDK的安装的&…

SAP 动态编程-动态获取结构字段对象(类模式)

实施方法 GET_DYNAMIC_FIELD_OBJECT 参数 代码 DATA: lt_source TYPE TABLE OF string.DATA: lv_name TYPE sy-repid VALUE ZTEMP_GET_DYNAMIC_OBJECT,lv_form(30) TYPE c VALUE FRM_GENERATE_OBJECT,lv_message(240) TYPE c,lv_line TYPE i,lv_word(72…

通过Idea部署Tomcat服务器(详细图文教学)

1.在idea中创建项目 有maven构建工具就创建maven&#xff0c;没有就正常创建一个普通的java程序 创建普通java项目 2.添加框架 3.配置 Tomcat 注意&#xff1a;创建web项目后我们需要配置tomcat才能运行&#xff0c;下面我们来进行配置。 4.添加部署 回到服务器 5.完善配置 6…

第28天-Kubernetes架构,集群部署,Ingress,项目部署,Dashboard

1.K8S集群部署 1.1.k8s快速入门 1.1.1.简介 Kubernetes简称k8s&#xff0c;是用于自动部署&#xff0c;扩展和管理容器化应用程序的开源系统。 中文官网&#xff1a;https://kubernetes.io/zh/中文社区&#xff1a;https://www.kubernetes.org.cn/官方文档&#xff1a;https…

Flask 是什么?Flask框架详解及实践指南

Flask 是一个轻量级的 Python Web 框架&#xff0c;它被广泛用于构建 Web 应用程序和 API。Flask 简单易用&#xff0c;具有灵活性和可扩展性&#xff0c;是许多开发者喜欢用其构建项目的原因。本文将介绍 Flask 是什么以及如何使用它来构建 Web 应用程序&#xff0c;同时提供一…

redis原理 3:未雨绸缪 —— 持久化

redis原理 3&#xff1a;未雨绸缪 —— 持久化 Redis 的数据全部在内存里&#xff0c;如果突然宕机&#xff0c;数据就会全部丢失&#xff0c;因此必须有一种机制来保证 Redis 的数据不会因为故障而丢失&#xff0c;这种机制就是 Redis 的持久化机制。 Redis 的持久化机制有两种…

【Ansible】Ansible自动化运维工具之playbook剧本搭建LNMP架构

LNMP 一、playbooks 分布式部署 LNMP1. 环境配置2. 安装 ansble3. 安装 nginx3.1 准备 nginx 相关文件3.2 编写 lnmp.yaml 的 nginx 部分3.3 测试 nginx4. 安装 mysql4.1 准备 mysql 相关文件4.2 编写 lnmp.yaml 的 mysql 部分4.3 测试 mysql5. 安装 php5.1 编写 lnmp.yaml 的 …

gradio创建机器学习的好工具 基本使用和示例

1.gradio介绍 Gradio: 用Python构建机器学习网页APP Gradio是一个开源的Python库,用于构建演示机器学习或数据科学,以及web应用程序。 使用Gradio,您可以基于您的机器学习模型或数据科学工作流快速创建一个漂亮的用户界面,让用户可以”尝试“拖放他们自己的图像、粘贴文本…

【云原生持续交付和自动化测试】5.2 自动化测试和集成测试

往期回顾&#xff1a; 第一章&#xff1a;【云原生概念和技术】 第二章&#xff1a;【容器化应用程序设计和开发】 第三章&#xff1a;【基于容器的部署、管理和扩展】 第四章&#xff1a;【微服务架构设计和实现】 第五章&#xff1a;【5.1 自动化构建和打包容器镜像】 5…

【深度学习_TensorFlow】感知机、全连接层、神经网络

写在前面 感知机、全连接层、神经网络是什么意思&#xff1f; 感知机&#xff1a; 是最简单的神经网络结构&#xff0c;可以对线性可分的数据进行分类。 全连接层&#xff1a; 是神经网络中的一种层结构&#xff0c;每个神经元与上一层的所有神经元相连接,实现全连接。 神经…