(记得重学)
● 344.反转字符串
题目:编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s
的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
示例 1:
输入:["h","e","l","l","o"]
输出:["o","l","l","e","h"]
示例 2:
输入:["H","a","n","n","a","h"]
输出:["h","a","n","n","a","H"]
题目链接:344. 反转字符串
卡哥的视频链接:字符串基础操作! | LeetCode:344.反转字符串
题目思考:和反转链表相似,但是要简单一些
代码示例:
终于有我能一次性直接写出来的题了哈哈哈哈哈哈
代码详解:
-
首先,定义了两个变量
left
和right
,分别表示字符数组的左右两个指针。left
指向数组的第一个字符,而right
指向数组的最后一个字符。 -
在
while
循环中,不断执行以下操作,直到left
指针大于等于right
指针:- 首先,创建一个临时变量
temp
,用于暂存left
指针指向的字符。 - 然后,将
right
指针指向的字符赋值给left
指针指向的位置,实现字符交换。 - 接着,将
temp
中暂存的字符赋值给right
指针指向的位置,实现字符交换。 - 最后,分别将
left
指针和right
指针向中间移动一位,继续进行下一轮的字符交换。
- 首先,创建一个临时变量
-
当
left
指针不再小于right
指针时,说明字符数组的所有字符都已经完成了翻转操作,整个循环结束。
这段代码利用了双指针的思想,从字符串的两端开始,逐步向中间移动,交换对应位置上的字符,从而实现了字符串的翻转。这样的算法复杂度为 O(n/2),其中 n 是字符数组的长度。
leetcode提交记录:
小tips:注意数组类型是字符型,新定义temp值的时候别忘了嗷!
● 541. 反转字符串II
题目:给定一个字符串 s
和一个整数 k
,从字符串开头算起,每计数至 2k
个字符,就反转这 2k
字符中的前 k
个字符。
- 如果剩余字符少于
k
个,则将剩余字符全部反转。 - 如果剩余字符小于
2k
但大于或等于k
个,则反转前k
个字符,其余字符保持原样。
示例 1:
输入:s = "abcdefg", k = 2 输出:"bacdfeg"
示例 2:
输入:s = "abcd", k = 2 输出:"bacd"
提示:
1 <= s.length <= 104
s
仅由小写英文组成1 <= k <= 104
题目链接:541. 反转字符串 II
卡哥的视频链接:字符串操作进阶! | LeetCode:541. 反转字符串II
题目思考:当需要固定规律一段一段去处理字符串的时候,要想想在在for循环的表达式上做做文章。
代码示例:
代码逻辑详解:
-
首先,将字符串
s
转换为字符数组c
,以便后续操作。 -
在
for
循环中,以步长为2*k
遍历字符数组c
,每次迭代都会处理从i
开始的k
个字符的反转。这样可以确保每隔k
个字符进行反转。 -
在每次迭代中,首先确定当前要反转的子字符串的起始位置
start
,即为i
。 -
然后,确定当前要反转的子字符串的结束位置
end
。由于要求反转k
个字符,所以end
的位置为start + k - 1
,但需要注意的是,如果剩余字符数量不足k
个,则end
的位置应该取剩余字符的最后一个位置,即c.length - 1
。这里使用了Math.min()
函数来确保end
不会超出数组的边界。 -
在确定了要反转的子字符串的起始和结束位置之后,使用双指针法对该子字符串进行反转操作。具体操作是交换
start
和end
指针位置上的字符,然后分别将start
指针和end
指针向中间移动,直到两指针相遇为止。 -
每次迭代完成后,字符数组
c
中的相应部分已经完成了反转操作。 -
最后,将字符数组
c
转换回字符串,并返回结果。
这段代码利用了双指针的思想和循环遍历数组的方法,实现了对字符串每隔 k
个字符进行反转的功能。
leetcode提交记录:
● 54.替换数字
题目:假定一段路径记作字符串 path
,其中以 ".
" 作为分隔符。现需将路径加密,加密方法为将 path
中的分隔符替换为空格 "
",请返回加密后的字符串。
示例 1:
输入:path = "a.aef.qerf.bb" 输出:"a aef qerf bb"
题目链接:LCR 122. 路径加密
题目思考:因为String不可以修改,所以只能申请一段新的空间
代码示例:
● 151.翻转字符串里的单词
给你一个字符串 s ,请你反转字符串中 单词 的顺序。
单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。
返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。
注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。
示例 1:
输入:s = “the sky is blue”
输出:“blue is sky the”
示例 2:
输入:s = " hello world "
输出:“world hello”
解释:反转后的字符串中不能存在前导空格和尾随空格。
示例 3:
输入:s = “a good example”
输出:“example good a”
解释:如果两个单词间有多余的空格,反转后的字符串需要将单词间的空格减少到仅有一个。
思路
1.先移除多余空格
//先用 fast 移除所有空格
//在用 slow 加空格。 除第一个单词外,单词末尾要加空格
//fast 遇到空格或遍历到字符串末尾,就证明遍历完一个单词了
2.将整个字符串反转
参考344反转字符串
3.最后把单词逐个反转
代码示例:
● 55.右旋转字符串