5. 替换空格

article/2025/9/10 3:45:31

文章目录

    • 剑指 Offer 05. 替换空格
      • 解法一:暴力解
      • 解法二:从后往前填充思想
    • 第五题的扩展题:合并两个有序数组 LeetCode 88
    • 88. 合并两个有序数组
      • 解法一:暴力解
      • 解法二:从后往前填充思想
    • 举一反三

剑指 Offer 05. 替换空格

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

示例 1:

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

限制:

0 < = s 的 长 度 < = 10000 0 <= s 的长度 <= 10000 0<=s<=10000

解法一:暴力解

使用StringBuilder,遇到字符就直接appendsb,遇到空格就append "%20"

Java代码

class Solution {public String replaceSpace(String s) {//返回空串,返回null提交失败,因为题目没有指明,故无伤大雅if(s == null || s.length() == 0) return ""; StringBuilder sb = new StringBuilder();for(int i = 0;i < s.length();i++){if(s.charAt(i) == ' '){sb.append("%20");//StringBuilder的append方法的参数可以是字符,也可以是字符串}else{sb.append(s.charAt(i));}}return sb.toString();}
}

go代码一

func replaceSpace(s string) string {if s == "" || len(s) == 0 { return "" }temp := make([]string,0)//注意:// 1. go中无char类型,go中可用byte表示字符// 2. 此处不可用range遍历,因为go中range遍历字符串得到的是rune类型,而非byte类型for i := 0;i < len(s);i++ {c := s[i]if c == ' ' {temp = append(temp,"%20")}else{temp = append(temp,string(c))}}return strings.Join(temp,"")
}

go代码二

func replaceSpace(s string) string {if s == "" || len(s) == 0 { return "" }/*标准库 strings 中有个Builder 类型,该类型中 WriteString 方法和 String 方法配合使用,也可以实现字符串拼接,可以拼接字符串、字符和 Unicode,但是无法和Java中的stringbuilder一样混合拼接字符串和字符底层虽然涉及 string 和 []byte 之间的转换,但是,它使用 unsafe.Pointer 优化了 string 和 []byte 之间的转换,所以,在大量字符串拼接的场景,推荐使用该种方式。*/var sb strings.Builderfor i:= 0; i < len(s);i++ {c := s[i]if c == ' ' {sb.WriteString("%20")} else {sb.WriteString(string(c))}}return sb.String()
}

在这里插入图片描述

解法二:从后往前填充思想

这种从后往前填充的思想,很多题中都有用到,应该好好掌握,灵活运用。

① 在字符串尾部填充任意字符,使得字符串的长度等于替换之后的长度。因为一个空格要替换成三个字符(%20),所以当遍历到一个空格时,需要在尾部填充两个任意字符。

② 令 P1 指向字符串原来的末尾位置,P2 指向字符串现在的末尾位置。P1P2 从后向前遍历,当 P1 遍历到一个空格时,就需要令 P2 指向的位置依次填充 02%(注意是逆序的),否则就填充上 P1 指向字符的值。从后向前遍是为了在改变 P2 所指向的内容时,不会影响到 P1 遍历原来字符串的内容。

③ 当 P2 遇到 P1 时(P2 <= P1),或者遍历结束(P1 < 0),退出。

Java代码

class Solution {public String replaceSpace(String s) {//返回空串,返回null提交失败,题目没有指明,故无伤大雅if(s == null || s.length() == 0) return ""; StringBuilder sb = new StringBuilder(s);for(int i = 0; i < s.length(); i++){if(s.charAt(i) == ' '){sb.append("  ");//在尾部添加两个空格}}int p1 = s.length() - 1;int p2 = sb.length() - 1;while(p2 > p1 && p1 >= 0){char c = sb.charAt(p1--);if(c == ' '){sb.setCharAt(p2--,'0');sb.setCharAt(p2--,'2');sb.setCharAt(p2--,'%');}else{sb.setCharAt(p2--,c);}}return sb.toString();}
}

在这里插入图片描述
go代码

func replaceSpace(s string) string {if s == "" || len(s) == 0 { return "" }//计算出最终结果字符串的长度length := 0for i:= 0; i < len(s);i++ {if s[i] != ' ' {length += 1}else{length += 3 //字符是空格时,一个字符将变成三个字符}}str := make([]byte,length)//建立和最终结果长度一致的byte切片p1 := len(s) - 1p2 := length - 1for p2 > p1 && p1 >= 0 {if s[p1] == ' ' {// go 中貌似无法使用str[p2--] = '0',这样使用的时候编译不通过str[p2] = '0'p2--str[p2] = '2'p2--str[p2] = '%'p2--}else {str[p2] = s[p1]p2--}p1--}//退出上面for循环后,如果s中还有字符没有遍历完(即是p2=p1时退出了上面for循环),但此时s[:p1]的所有字符也是需要放到str中的for p1 >= 0 {str[p2] = s[p1]p2--p1--}return string(str)
}

在这里插入图片描述


第五题的扩展题:合并两个有序数组 LeetCode 88

88. 合并两个有序数组

给你两个有序整数数组 nums1nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。

初始化 nums1nums2 的元素数量分别为 mn 。你可以假设 nums1 的空间大小等于 m + n,这样它就有足够的空间保存来自 nums2 的元素。

示例 1:

输入: nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
输出: [1,2,2,3,5,6]

示例 2:

输入: nums1 = [1], m = 1, nums2 = [], n = 0
输出: [1]

提示:

n u m s 1. l e n g t h = = m + n nums1.length == m + n nums1.length==m+n
n u m s 2. l e n g t h = = n nums2.length == n nums2.length==n
0 < = m , n < = 200 0 <= m, n <= 200 0<=m,n<=200
1 < = m + n < = 200 1 <= m + n <= 200 1<=m+n<=200
− 1 0 9 < = n u m s 1 [ i ] , n u m s 2 [ i ] < = 1 0 9 -10^9 <= nums1[i], nums2[i] <= 10^9 109<=nums1[i],nums2[i]<=109

解法一:暴力解

暴力解法,将nums2的所有元素添加到nums1中,然后用快速排序即可。时间复杂度 O ( ( m + n ) l o g ( m + n ) ) O((m+n)log(m+n)) O((m+n)log(m+n))

Java代码

class Solution {public void merge(int[] nums1, int m, int[] nums2, int n) {for(int i = m,j = 0;i<nums1.length && j<n;i++,j++){nums1[i] = nums2[j];}Arrays.sort(nums1);}
}

在这里插入图片描述
go代码
貌似go语言中无法在for循环的最后一段使用逗号表达式,如下面写法编译不通过
在这里插入图片描述
而如下写法提交成功

func merge(nums1 []int, m int, nums2 []int, n int)  {for i,j := m,0;i < m + n; {nums1[i] = nums2[j]i++j++   }sort.Ints(nums1)
}

在这里插入图片描述

解法二:从后往前填充思想

用从后往前的双指针方法,类似上面第五题的解法。从尾到头比较两个数组中的数字,并将较大的数字复制到nums1中的合适位置。时间复杂度为遍历一次数组 O ( m + n ) O(m+n) O(m+n)

Java代码

class Solution {public void merge(int[] nums1, int m, int[] nums2, int n) {//由于两个数组是有序的,故我们可以从后往前的慢慢补全nums1,时间O(n),空间O(1)int p1 = m-1;//nums1的尾位置int p2 = n-1;//nums2的尾位置int p = m+n-1;//拼接后的尾位置while(p1>=0 && p2>=0){//有至少一个数组遍历完时退出循环nums1[p--] = nums1[p1] < nums2[p2] ? nums2[p2--] :nums1[p1--];}//不管是p1<0了(nums2中有剩余),还是p2<0了(nums1中有剩余),都可用下式System.arraycopy(nums2,0,nums1,0,p2+1);}
}

在这里插入图片描述
go代码

func merge(nums1 []int, m int, nums2 []int, n int)  {p1 := m - 1p2 := n - 1p := m + n - 1for p1 >= 0 && p2 >= 0 {if nums1[p1] > nums2[p2] {nums1[p] = nums1[p1]p--p1--} else {nums1[p] = nums2[p2]p--p2--}}//下面两个for只会有一个执行//如果是nums1还未往前遍历完for p1 >= 0 {nums1[p] = nums1[p1]p--p1--}//如果是nums2还未往前遍历完for p2 >= 0 {nums1[p] = nums2[p2]p--p2--}
}

在这里插入图片描述

举一反三

在合并两个数组 (包括字符串)时,如果从前往后复制每个数字(或字符)则需要移动数字(或字符)多次,那么我们可以考虑从后往前复制,这样就能减少移动的次数,从而提高效率,且算法代码看着更清晰易懂。


http://chatgpt.dhexx.cn/article/SZO0aFwy.shtml

相关文章

字符串中的空格替换

输入一个字符串&#xff0c;需要我们使用其他的字符替换空格字符。 例如&#xff1a;一个字符串&#xff1a;“We are happy.”&#xff0c;将其中的空格字符用%20替换。怎么做呢&#xff1f; **第一种思路&#xff1a;**暴力法则&#xff0c;就是直接遍历字符串&#xff0c;遇…

1.【刷爆LeetCode】替换空格(多方法、多思路解决)

大家好我是Liyuyue&#xff01; 接下来我会讲我刷的LeetCode好题用到的好思路、好方法分享给大家一起学习&#xff0c;如果大家在看的过程中还有好的方法&#xff0c;可以评论区或者直接找我继续讨论&#xff0c;感谢大家的支持~&#xff01; 我们先来看要求&#xff1a; 简要分…

学习笔记 - excel筛选分组

整理excel的时候&#xff0c;遇到一个分组功能筛选功能&#xff0c;原始excel内容如下&#xff1a; excel右上角有个筛选功能框 点击下拉列中的“筛选”&#xff0c;excel界面如下显示&#xff0c;标识可以进行筛选功能了&#xff0c;所有列都加入了筛选项目。 点击City Name下…

excel 分组计数

采用数据透视表的方法对数据进行分组技数 1.现在需要对 下表中各类型出现的次数进行统计。 2.选中区域点击数据透视表 3.首先&#xff0c;把类型拖到“值”和“行”中&#xff0c;需要注意的是在值中要选择“计数项&#xff01;&#xff01;&#xff01;&#xff01;&#xff…

excel自动分组

1.将年龄分组&#xff08;设置步长&#xff09; 2.日期按照季度分组

excel 手动分组和自动分组

1某个类别下有多个条目&#xff0c;我们想打开折叠显示 方法一&#xff1a;一个个的设置分组 2方法二&#xff1a; 自动分级显示 上面的实现方式&#xff0c;还是直接使用excel的分组功能&#xff0c;只不过在处理过程中&#xff0c;会遇到组成员一个时&#xff0c;处理就会麻…

Excel分组行转列

表格一 表格二 Excel表格一分组行转列变为表格二所示的格式怎么弄&#xff1f; 方案一&#xff1a; 转置粘贴&#xff0c; 每组数据单独处理&#xff0c;一组一组的选择&#xff0c;然后右键“粘贴选项”->“转置”&#xff0c;这样这一组数据就列传行了。 重复所有分组&…

excel将数据按某一列值分组并绘制分组折线图

目录 一、实现按id分组 二、绘制分组折线图 今天在处理数据的时候发现了一个很巧妙的EXCEL绘制分组折现图的方法&#xff0c;简单记录分享一下。我的数据大概长这样,我希望实现的目标是根据产品id分组绘制不同产品的销量图。 一、实现按id分组 复制产品id那一列&#xff0c;点击…

如何用excel对数据按月分组

建立数据透视表 选中一个单元格-插入-数据透视表 选择要分析的数据及结果显示位置 我主要是分析收益波动&#xff0c;需要的数据是日期和收益率&#xff0c;因此勾选date和return 数据会自动按年和季度分类 结果如图&#xff1a; 进一步将数据按月分类&#xff0c;可以在结果…

【excel】分组连续排名和不连续排名公式

需求场景&#xff1a;对上面的数据进行排名计算&#xff0c;4种情况&#xff1a; ①不考虑commDate&#xff0c;单独对FoldPageNum进行排名&#xff0c;不连续排名&#xff1b; ②不考虑commDate&#xff0c;单独对FoldPageNum进行排名&#xff0c;连续排名&#xff1b; ③按co…

Excel分组数据、并创建多个新Excel文件

需求描述 原文件test.xlsx"为.xlsx格式&#xff0c;需要对不同行业的数据 进行切分&#xff0c;并存储在不同Excel表中。 步骤 1. 读取Excel转化为DataFrame import pandas as pd df pd.read_excel("test"".xlsx") df.head(10) #查看前十条数据…

Python 绘画excel分组柱状图(懒人学习)

1.excel案例如截图&#xff1a; 很简单大家自己照着做一个就可以了。 2.完整代码如下&#xff1a; import pandas as pd import matplotlib.pyplot as plt students pd.read_excel(‘H:/Python自动化办公–Pandas玩转Excel源代码&#xff08;7-30&#xff09;/010/Studen…

使用EXCEL进行数据分组分析法

分组分析是将总体数据按照某一特征性质划分成不同的部分和类型进行研究&#xff0c;从而深入分析其内在规律。 一、为什么要分组&#xff1f; 对于大量的数据&#xff0c;如果不进行分组是很难发现其中规律&#xff0c;找到不同组别之间的关系&#xff0c;从而更好地对比&…

如何在Excel中分组排名?两个公式轻松搞定!

点赞再看&#xff0c;养成习惯&#xff1b;桃李不言&#xff0c;下自成蹊。 微信搜索【亦心Excel】关注这个不一样的自媒体人。 本文 GitHub https://github.com/hugogoos/Excel 已收录&#xff0c;包含Excel系统学习指南系列文章&#xff0c;以及各种Excel资料。 教导主任给了…

excel分组求最小值

求一列的最大值最小值简单&#xff0c;但是有时候需要找出一列数据中每个分组的最大最小值&#xff0c;尤其是数据量较大的时候&#xff0c;难以手动去标出&#xff0c;这时最好用函数解决。 解决办法&#xff1a; 统计函数&#xff0c;在C列中输入公式&#xff0c; IF(B2MIN(…

excel实现分组计数

实现效果—如图&#xff1a;统计各区间成绩数量 更详细讲解&#xff1a;点击查看原文 操作步骤如图&#xff1a; 核心要点&#xff1a; 将【成绩】分别拖入【行】和【值】&#xff0c;并将【值-值字段属性&#xff1a;设为计数&#xff08;图二&#xff09;】

excel----分组后统计

复制一列后数据删除重复值后分组 countif分组统计一列中项出现的次数 sumif分组统计组内和 找出一列中不重复的项 d2中写入下面的公式&#xff0c;然后下拉得到三项&#xff01; INDEX(A:A,MIN(IF(COUNTIF($D$1:D1,$A$2:$A$11),65536,ROW($A$2:$A$11))))&""

Excel 数据随机分组

文章目录 1. 任务描述2. 实现方法一&#xff1a;Excel 函数3. 实现方法二&#xff1a;方方格子 Excel 插件 1. 任务描述 给定一定数量的数据&#xff0c;要求随机分成 n 组。例如&#xff0c;老师将学生随机分组进行讨论&#xff0c;部门将员工随机分组参加活动等。下面使用 Ex…

利用计算机进行频数分布表制作,excel制作交叉分组表,excel分组频数分布表

我们在编辑Excel表格的时候&#xff0c;如果数据很多则有可能造成数据的重复输入&#xff0c;这样不仅影响数据的准确性&#xff0c;而且还会浪费我们的时间&#xff0c;不过想要在海量的数据表中找到那些重复值也并非易事&#xff0c;下面小编以Excel 2013为例&#xff0c;教大…

Excel如何分组排序

之前有同学发了一个这个问题&#xff0c;如下图所示&#xff0c;左边是原始数据表&#xff0c;标有底色的B/G/H列是要按照右表中的要求进行公式计算的。 如要求所示&#xff0c;B列排名是按照某片区下某等级之间的5月业绩环比分组排名&#xff0c;G列“是否各片区等级前两名”要…