【LeetCode字符串#02】替换空格+IP地址无效化,reserve和resize的区别分析
替换空格
请实现一个函数,把字符串 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去给数组扩容
首先得区分清楚概念
对于(数组)容器来说,在初始化时,能够描述其"大小"的是两个参数:capacity和size
capacity是容器初始化时的赋值,指的是容器最多能容纳的元素个数(所指容器可以还没创建)
size则是指当前容器中实际的元素个数(所指容器已经创建)
举个例子:
"一个瓶子的容积是550ml(capacity),现在里面装有300ml(size)水"
回到reserve和resize
reserve一般用于为容器预留空间,所谓预留即该容器还没有被创建,等到容器需要创建的时候再按预留空间的大小创建。也就是说reserve可以修改capacity,但不能修改size,因为容器还没创建,没有size属性
再举个例子:
"这次买(创建)的罐装可乐才250ml,不够喝,下次(预留操作,reserve)要买500ml的(修改了下次创建容器时的大小)"
resize则会同时修改capacity和size,此时容器的可用空间会变成新的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的区别分析的更多相关文章
- 1108. IP 地址无效化
给你一个有效的 IPv4 地址 address,返回这个 IP 地址的无效化版本. 所谓无效化 IP 地址,其实就是用 "[.]" 代替了每个 ".". 示例 ...
- [LeetCode]1108. IP 地址无效化
给你一个有效的 IPv4 地址 address,返回这个 IP 地址的无效化版本. 所谓无效化 IP 地址,其实就是用 "[.]" 代替了每个 ".". 示例 ...
- leetcode-解题记录 1108. IP 地址无效化
题目: 给你一个有效的 IPv4 地址 address,返回这个 IP 地址的无效化版本. 所谓无效化 IP 地址,其实就是用 "[.]" 代替了每个 ".". ...
- PHP算法之IP 地址无效化
给你一个有效的 IPv4 地址 address,返回这个 IP 地址的无效化版本. 所谓无效化 IP 地址,其实就是用 "[.]" 代替了每个 ".". 示例 ...
- IP 地址无效化
给你一个有效的 IPv4 地址 address,返回这个 IP 地址的无效化版本. 所谓无效化 IP 地址,其实就是用 "[.]" 代替了每个 ".". 示例 ...
- LeetCode 1108. Defanging an IP Address (IP 地址无效化)
题目标签:String 题目给了我们一组 ip address,让我们把 . 变成 [.],这题可以用replace,但是这样做的话,好像没意义了.所以还是走一下array,具体看code. Java ...
- LeetCode算法训练 93.复原IP地址 78.子集 90.子集II
欢迎关注个人公众号:爱喝可可牛奶 LeetCode算法训练 93.复原IP地址 78.子集 90.子集II LeetCode 93. 复原 IP 地址 分析 字符串全部由数字组成,ipv4每一段数字不 ...
- python实现判断一个字符串是否是合法IP地址
#!usr/bin/env python #encoding:utf-8 ''''' __Author__:沂水寒城 功能:判断一个字符串是否是合法IP地址 ''' import re def jud ...
- 判断一个字符串是否是合法IP地址
# -*- coding: utf-8 -*- """ @File:test06_判断ip地址是否合法.py @E-mail:364942727@qq.com @Time ...
- 【面试题004】c/c++字符串,替换空格
一,c/c++字符串 1.C/C++中每个字符串都以字符’\0‘作为结尾,这样我们就能很方便地找到字符串的最后尾部. 由于这个原因每个字符串都有一个额外的开销,注意字符串越界的问题: 2.C/C+ ...
随机推荐
- [转帖]关于gdb相关的几个工具的说明
https://phpor.net/blog/post/846 使用rpm命名查看gdb的rpm包,主要由下面几个程序:/usr/bin/gcore/usr/bin/gdb/usr/bin/gdbse ...
- [转帖]兆芯官方的CPU测试成绩,我复现不了
https://baijiahao.baidu.com/s?id=1734998483605483848 下图是兆芯网官上的公开测试成绩,测试对象是3.0GHz的KX-U6880A. 有几个问题: ...
- [转帖]总结:记一次K8S容器OOM案例
一.背景 最近遇到个现象,hubble-api-open组件过段时间会内容占满,从而被K8S强制重启. 让我困惑的是,已经设置了-XX:MaxRAMPercentage=75.0,我觉得留有了一定的空 ...
- [转帖]013 Linux 搞懂「文件所属者更改及权限的赋予」从未如此简单 (chmod、chgrp、chown)
https://my.oschina.net/u/3113381/blog/5435014 01 一图详解「ls -l」 02 两种符号区分表示文件和目录 -(横线) # 表示非目录文件 d # ...
- [转贴]30 分钟学会 AWK
30 分钟学会 AWK https://mp.weixin.qq.com/s/X0ire4dYiceC2CzPU6JsSw? Linux爱好者 2017-01-08 (点击上方公众号,可快速关注) ...
- Windows 环境下简单的自动备份以及清理数据库的操作过程
今天能想到要简单的备份一下windows上面的数据库. 然后并且能够定期清理文件. 然后从网上找了一下 找到把饭如下 1. 备份 创建一个目录用来存放数据库备份 c:\dbbak 然后编写一个脚本, ...
- FS OFS RS ORS
- paddleNLP-BUG和一些细节记录【一】
1.TypeError: isfile() takes 1 positional argument but 2 were given File "/root/miniconda3/envs/ ...
- Metasploit 生成带SSL加密载荷
1.下载证书.Impersonate_SSL模块,下载指定网站的证书. msf6> use auxiliary/gather/impersonate_ssl msf6 auxiliary(gat ...
- h5st 4.3版本代码研究
背景介绍 最近比较悠闲,于是没事研究了一下某东的h5st代码,2024年新鲜出炉的前端加密代码: 最大的惊喜并不是算法的复杂,在逆向破解代码的过程中,对js加密混淆有了新的认识: 于是心血来潮,回到这 ...