题目: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重新做一下下面的几个题