[代码随想录]Day07-字符串 part01
1.[代码随想录]Day01-数组part012.[代码随想录]Day02-数组part023.[代码随想录]Day06-哈希表 part024.[代码随想录]Day05-哈希表 part015.[代码随想录]Day04-链表part026.[代码随想录]Day03-链表part017.[代码随想录]Day14-二叉树part038.[代码随想录]Day13-二叉树part029.[代码随想录]Day12-二叉树part0110.[代码随想录]Day11-栈与队列part0311.[代码随想录]Day10-栈与队列part0212.[代码随想录]Day09-栈与队列part0113.[代码随想录]Day08-字符串 part02
14.[代码随想录]Day07-字符串 part01
15.[代码随想录]Day30-贪心算法part0416.[代码随想录]Day29-贪心算法part0317.[代码随想录]Day28-贪心算法part0218.[代码随想录]Day27-贪心算法part0119.[代码随想录]Day26-回溯算法part0620.[代码随想录]Day25-回溯算法part0521.[代码随想录]Day24-回溯算法part0422.[代码随想录]Day23-回溯算法part0323.[代码随想录]Day22-回溯算法part0224.[代码随想录]Day21-回溯算法part0125.[代码随想录]Day20-二叉树part0926.[代码随想录]Day19-二叉树part0827.[代码随想录]Day18-二叉树part0728.[代码随想录]Day17-二叉树part0629.[代码随想录]Day16-二叉树part0530.[代码随想录]Day15-二叉树part0431.[代码随想录]Day52-单调栈part0332.[代码随想录]Day51-单调栈part0233.[代码随想录]Day50-单调栈part0134.[代码随想录]Day49-动态规划part1735.[代码随想录]Day48-动态规划part1636.[代码随想录]Day47-动态规划part1537.[代码随想录]Day46-动态规划part1438.[代码随想录]Day45-动态规划part1339.[代码随想录]Day44-动态规划part1240.[代码随想录]Day43-动态规划part1141.[代码随想录]Day42-动态规划part1042.[代码随想录]Day41-动态规划part0943.[代码随想录]Day40-动态规划part0844.[代码随想录]Day39-动态规划part0745.[代码随想录]Day38-动态规划part0646.[代码随想录]Day37-动态规划part0547.[代码随想录]Day36-动态规划part0448.[代码随想录]Day35-动态规划part0349.[代码随想录]Day34-动态规划part0250.[代码随想录]Day33-动态规划part0151.[代码随想录]Day32-贪心算法part0652.[代码随想录]Day31-贪心算法part05题目:344. 反转字符串
思路:
每次把最前面和最后面的交换位置即可
strings
库里没有反转的方法
——这个反转是之后几个题的一个基础
代码:
双指针调换位置
func reverseString(s []byte) {
l, r := 0, len(s) - 1 // 最前面的元素,最后面的元素
for l < r {
s[l], s[r] = s[r], s[l] // 调换位置
l++
r--
}
}
参考:
题目:541. 反转字符串 II
思路:
首先,这道题的难点在于对Go的字符串理解,Go的字符串不能修改,所以首先要转换成string类型。
而且要注意的一点是[]byte是切片类型,它的底层是数组指针,因此reverse
传进去的参数是会修改的。
之后就是记得转换回string类型
代码:
func reverseStr(s string, k int) string {
lens := len(s)
ss := []byte(s) // 转换成[]byte进行操作
for i := 0 ;i < lens ; i += 2 * k{ // 每次都要加2*k
if lens - i >= k { // 如果剩余的数量大于k那就把前k个翻转
reverse(ss[i:i+k])
}else { // 剩下的不足k,全部翻转
reverse(ss[i:])
}
}
return string(ss) // 转换回string
}
func reverse(s []byte){
l, r := 0, len(s) - 1
for l < r {
s[l], s[r] = s[r], s[l]
l++
r--
}
}
参考:
题目:剑指 Offer 05. 替换空格
思路:
方法一:遍历一遍,遇到空格,添加"%20"
方法二:使用strings
的Replace
方法——func Replace(s, old, new string, n int) string
;其中s是要进行操作的字符串,old是替换前的字段,new是替换后的字段,n是替换的个数(-1就是全部)。
方法三:直接进行修改,增加长度,然后从后向前遍历。
代码1:
遍历
func replaceSpace(s string) string {
res := "" // 结果
for i := 0; i < len(s); i++ { // 遍历
if s[i] == ' ' { // 单个是byte类型
res += "%20"
}else{
res += string(s[i]) // 转换成string类型
}
}
return res
}
代码2:
函数
func replaceSpace(s string) string {
s = strings.Replace(s," ","%20",-1) // 把s中的" "全部替换成"%20"
return s
}
参考:
题目:151. 反转字符串中的单词
思路:
方法一:在原字符串修改,解题思路如下:
- 移除多余空格
- 将整个字符串反转
- 将每个单词反转
举个例子,源字符串为:"the sky is blue "
- 移除多余空格 : "the sky is blue"
- 字符串反转:"eulb si yks eht"
- 单词反转:"blue is sky the"
方法二:调用库函数
方法三:遍历,找到每个单词然后添加到结果中
代码1:
调用库
func reverseWords(s string) string {
t := strings.Fields(s) // 分割字符串,无视空格
l, r := 0, len(t) - 1
for l < r {
t[l], t[r] = t[r], t[l] // 交换位置
l++
r--
}
return strings.Join(t," ") // 添加
}
代码2:
遍历
func reverseWords(s string) string {
res := "" // 存储答案
s = " " + s + " " // 前后都加空格统一处理
lens := len(s)
l, r := lens -2, lens - 1
for l >= 0 {
if s[l+1] == ' ' && s[l] != ' ' { // 确定单词尾部
r = l + 1
}
if s[l+1] != ' ' && s[l] == ' ' { // 确定单词头部并添加
res += s[l+1:r] + " " // 全都带" "
}
l--
}
return res[:len(res)-1] // 最后多了一个" "
}
参考:
题目:剑指 Offer 58 - II. 左旋转字符串
思路:
以输入: s = "abcdefg", k = 2为例:
方法一:两个s拼接起来,然后返回中间部分
“abcdefg” + “abcdefg” = “abcdefgabcdefg” 然后再取"ab【cdefgab】cdefg"
方法二:直接分成两部分,然后拼起来:
"【ab】【cdefg】" -> "【cdefg】【ab】"
代码:
func reverseLeftWords(s string, n int) string {
lens := len(s)
s = s + s
return s[n:n+lens]
// return s[n:] + s[:n] 直接返回这个
}
参考:
总结
- 薄弱点strings库了解不深,之后需要补一下
- 之后再用reverse重新做一下下面的几个题
合集:
代码随想录
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!