替换空格

力扣题目链接(opens new window)

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

示例 1: 输入:s = "We are happy."

输出:"We%20are%20happy."

思路

一个错误思路:

class Solution {
public:
string replaceSpace(string s) {
for(int i = 0; i < s.size(); i++){
if(s[i] == " "){
s[i] = "%20";
}
}
return s;
}
};

写python可能可以这么干,但是c++不行

注意审题,我们要插入的 "%20" 是什么东西?这是个字符串

而空格,也就是" ",它是个字符

直接把字符串插到字符的位置,第一,位置不够插不进去,第二,要插也是得一个一个插

这里依然用双指针的方法

维护一对双指针,从字符串末尾向头部遍历

两个指针的起点分别为旧字符串和新字符串的末尾,即 i 和 j

当 i 碰到空格时,j从当前位置开始,往前填充待插入的字符串,然后将j跳转到填充结束的位置

如果 i 没碰到空格,正常将 i 位置与 j 位置的字符交换

代码

class Solution {
public:
string replaceSpace(string s) {
//先统计空格个数,为扩容做准备
int count = 0;
int sOldLen = s.size();//扩容前字符串的长度
for(int i = 0; i < sOldLen; i++){
if(s[i] == ' '){
count++;
}
}
//字符串扩容
//如示例1,有两个空格,字符串长度为8,如果用待插入的字符串代替空格后,新字符串的长度应该为12(8-2+6)
s.resize(sOldLen + count*2);//注意不是reserve
int sNewLen = s.size();
//维护一对双指针,从字符串末尾开始遍历
//指针的起点分别为旧字符串长度下的末尾和新字符串长度下的末尾
for(int i = sOldLen - 1,j = sNewLen - 1; i < j; i--, j--){
//如果i没有碰到空格,交换i与j的字符
if(s[i] != ' '){
s[j] = s[i];
}else{//碰到空格,将j接下来的三位依次替换为插入值
s[j] = '0';
s[j - 1] = '2';
s[j - 2] = '%';
j-=2;
}
}
return s;
}
};
易错点
1、字符串扩容

C++中并没有专门的字符串的类型,因此一个字符串实际上就是一个字符数组

是数组就可以扩容

2、reserve和resize的区别

这里容易拿reserve去给数组扩容

首先得区分清楚概念

对于(数组)容器来说,在初始化时,能够描述其"大小"的是两个参数:capacitysize

capacity是容器初始化时的赋值,指的是容器最多能容纳的元素个数(所指容器可以还没创建)

size则是指当前容器中实际的元素个数(所指容器已经创建)

举个例子:

"一个瓶子的容积是550ml(capacity),现在里面装有300ml(size)水"

回到reserve和resize

reserve一般用于为容器预留空间,所谓预留即该容器还没有被创建,等到容器需要创建的时候再按预留空间的大小创建。也就是说reserve可以修改capacity,但不能修改size,因为容器还没创建,没有size属性

再举个例子:

"这次买(创建)的罐装可乐才250ml,不够喝,下次(预留操作,reserve)要买500ml的(修改了下次创建容器时的大小)"

resize则会同时修改capacitysize,此时容器的可用空间会变成新的capacity的大小,

例子:

"我有个小杯子(原容器),里面有300ml水,不够装,我现在马上拿一个500ml的大杯子(扩容,resize)把原来的水装进去,现在够了"

(上述比喻不知道是否贴切,如果resize没有涉及开辟新空间->拷贝原有元素到新空间,那么将比喻中的小杯子换成伸缩杯子会准确一些)

IP 地址无效化

https://leetcode.cn/problems/defanging-an-ip-address/

给你一个有效的 IPv4 地址 address,返回这个 IP 地址的无效化版本。

所谓无效化 IP 地址,其实就是用 "[.]" 代替了每个 "."。

示例 1:

输入:address = "1.1.1.1"

输出:"1[.]1[.]1[.]1"

示例 2:

输入:address = "255.100.50.0"

输出:"255[.]100[.]50[.]0"

提示:

给出的 address 是一个有效的 IPv4 地址

思路

和替换空格一样,也是先给字符串扩容(这里是IP字符串),然后用双指针从后向前遍历,遇到'.',指向新结尾的指针就开始补填充字符串

注意,这里的扩容大小是固定的,也就是说都是3*2,即三个'.',然后填充字符串("[.]" )的长度为2

代码

class Solution {
public:
string defangIPaddr(string address) {
int oldSize4Address = address.size();
//给地址数组扩容
address.resize(oldSize4Address + 3 * 2);//3是IP字符串中‘.’的数量,2是"[.]"的长度 int newSize4Address = address.size(); for(int oldp4IP = oldSize4Address - 1, newp4IP = newSize4Address - 1; oldp4IP < newp4IP; --oldp4IP, --newp4IP){
if(address[oldp4IP] == '.'){
address[newp4IP] = ']';
address[newp4IP - 1] = '.';
address[newp4IP - 2] = '[';
newp4IP -= 2;
}else{
address[newp4IP] = address[oldp4IP];
}
}
return address;
}
};

【LeetCode字符串#02】替换空格+IP地址无效化,reserve和resize的区别分析的更多相关文章

  1. 1108. IP 地址无效化

    给你一个有效的 IPv4 地址 address,返回这个 IP 地址的无效化版本. 所谓无效化 IP 地址,其实就是用 "[.]" 代替了每个 ".". 示例 ...

  2. [LeetCode]1108. IP 地址无效化

    给你一个有效的 IPv4 地址 address,返回这个 IP 地址的无效化版本. 所谓无效化 IP 地址,其实就是用 "[.]" 代替了每个 ".". 示例 ...

  3. leetcode-解题记录 1108. IP 地址无效化

    题目: 给你一个有效的 IPv4 地址 address,返回这个 IP 地址的无效化版本. 所谓无效化 IP 地址,其实就是用 "[.]" 代替了每个 ".". ...

  4. PHP算法之IP 地址无效化

    给你一个有效的 IPv4 地址 address,返回这个 IP 地址的无效化版本. 所谓无效化 IP 地址,其实就是用 "[.]" 代替了每个 ".". 示例 ...

  5. IP 地址无效化

    给你一个有效的 IPv4 地址 address,返回这个 IP 地址的无效化版本. 所谓无效化 IP 地址,其实就是用 "[.]" 代替了每个 ".". 示例 ...

  6. LeetCode 1108. Defanging an IP Address (IP 地址无效化)

    题目标签:String 题目给了我们一组 ip address,让我们把 . 变成 [.],这题可以用replace,但是这样做的话,好像没意义了.所以还是走一下array,具体看code. Java ...

  7. LeetCode算法训练 93.复原IP地址 78.子集 90.子集II

    欢迎关注个人公众号:爱喝可可牛奶 LeetCode算法训练 93.复原IP地址 78.子集 90.子集II LeetCode 93. 复原 IP 地址 分析 字符串全部由数字组成,ipv4每一段数字不 ...

  8. python实现判断一个字符串是否是合法IP地址

    #!usr/bin/env python #encoding:utf-8 ''''' __Author__:沂水寒城 功能:判断一个字符串是否是合法IP地址 ''' import re def jud ...

  9. 判断一个字符串是否是合法IP地址

    # -*- coding: utf-8 -*- """ @File:test06_判断ip地址是否合法.py @E-mail:364942727@qq.com @Time ...

  10. 【面试题004】c/c++字符串,替换空格

      一,c/c++字符串 1.C/C++中每个字符串都以字符’\0‘作为结尾,这样我们就能很方便地找到字符串的最后尾部. 由于这个原因每个字符串都有一个额外的开销,注意字符串越界的问题: 2.C/C+ ...

随机推荐

  1. [转帖]logback:logback和slf4j中的:appender、logger、encoder、layout

    (1)appender 1.appender标签是logback配置文件中重要的组件之一.在logback配置文件中使用appender标签进行定义.可 以包含0个或多个appender标签. 2.a ...

  2. 手写一个Promise完成resolve 和 reject状态的改变和修改属性

    1.手写 Promise 1 创建一个文件 Promise.js:内容 function Promise(){ } 2 引入 Promise.js 这个文件 <script src=" ...

  3. P5963 [BalticOI ?] Card 卡牌游戏【来源请求】

    [rt](https://www.luogu.com.cn/problem/P5963)------------## part1### 题意简述给你 $n$ 张纸牌,每张纸牌有两个面.将 $n$ 张纸 ...

  4. c#时间格式转换汉字大写

    把时间转换为汉字大写 public class DateTimeConvert { public static string ConvertToChineseCapital(DateTime date ...

  5. nodejs的npm改为国内源和参数

    npm源改为国内 此方法不需要安装cnpm也可以使用淘宝镜像,提高国内访问速度 由于 Node 的官方模块仓库网速太慢,模块仓库需要切换到阿里的源. npm config set registry h ...

  6. Python xlwt数据保存到 Excel中以及xlrd读取excel文件画图

    1.方法一:xlwt 1.1 安装包 pip install xlwt 1.2 保存数据到 Excel import xlwt import numpy as np import random # 新 ...

  7. 使用Miniconda安装R语言环境

    使用Miniconda安装R语言 下载Miniconda3-latest-Linux-x86_64.sh 静默安装 sh Miniconda3-latest-Linux-x86_64.sh -b -p ...

  8. Star 4.2k,这是我用过最舒服的跨平台Redis桌面客户端

    项目介绍 Tiny RDM 一个现代化轻量级的跨平台Redis桌面客户端,支持Mac.Windows和Linux 软件截图 运行效果 版本展示 配置连接 项目亮点 极致轻量 极小包体,随处安装随处使用 ...

  9. 理论与实战:一篇看懂Python词云

    理论与实战:一篇看懂Python词云 后宫王镇贴 前言:本文初编辑于2024年2月2日 该项目代码的仓库地址:https://github.com/A-Piece-Of-Maple/WordCloud ...

  10. 【学习笔记】Python 环境隔离

    目录 前言 venv venv 环境管理 venv 包管理 virtualenv 以及 virtualenvwrapper 安装 virtualenvwrapper 环境管理 virtualenvwr ...