1.344. 反轉字符串 - 力扣(LeetCode)
func reverseString(s []byte) {left := 0right := len(s)-1for left <= right{s[left],s[right] = s[right],s[left]left++right--}return
}
感悟:還是go語法熟練程度的問題,需要注意的是:?s[left],s[right] = s[right],s[left]這是go語言交換的常用寫法。或者也可以先轉換成rune切片 runes := []rune(s),最后再轉換回string(runes),因為string的底層是byte
2.541. 反轉字符串 II - 力扣(LeetCode)
func reverseStr(s string, k int) string {runes := []rune(s)n := len(runes)for i := 0;i<n;i += 2*k{if i+k >= n{reverse(runes[i:n])}else{reverse(runes[i:i+k])}}return string(runes)
}func reverse(runes []rune){i := 0j :=len(runes)-1for i<= j{runes[i],runes[j] = runes[j],runes[i]i++j--}
}
感悟:題目不難,復習了go語言的string可讀性,所以如果要操縱字符串,先要改寫成rune類型。同時函數傳參的時候也體現了切片的靈活性。runes[i:n]
3.54. 替換數字(第八期模擬筆試)
package main
import "fmt"func main(){var strByte []bytefmt.Scanln(&strByte)for i := 0;i<len(strByte);i++{if strByte[i]>='a'&&strByte[i]<='z'{continue}addbyte := []byte{'n','u','m','b','e','r'}strByte = append(strByte[:i],append(addbyte[:len(addbyte)],strByte[i+1:]...)...)i+=len(addbyte)-1}fmt.Println(string(strByte))
}
感悟:本道題不難,需要強化的是go語言append的語法,以及...的運用。...
?(可變參數)本質上是一種 “語法糖”,自動將切片拆解為多個獨立元素,適配?append
?的可變參數要求。
4.151. 反轉字符串中的單詞 - 力扣(LeetCode)
func reverseWords(s string) string {runes := []rune(s)//去除多余空格slow,fast:=0,0for len(runes) >0 && fast < len(runes) && runes[fast] == ' '{fast++}//頭部for ; fast < len(runes) ;fast++{if fast -1 >0 && runes[fast-1] == runes[fast] &&runes[fast] == ' '{continue}runes[slow] = runes[fast]slow++//伏筆}//有可能指向空格的下一位if runes[slow-1] == ' ' && slow -1 >0{runes = runes[:slow-1]}else{runes = runes[:slow]}reverse(runes) //翻轉整個字符串for i := 0; i < len(runes);i++{j := ifor ;j < len(runes)&&runes[j] != ' ';j++{}reverse(runes[i:j])i = j} return string(runes)
}func reverse(b []rune){left := 0right := len(b) - 1for left < right {b[left],b[right] = b[right],b[left]left++right--}
}
感悟:本道題確實忘了,確實不記得了。嚴重需要三刷!!!總體思路:雙指針去空格,fast負責移動,slow負責賦值。好多細節。除此之外,先整體翻轉,再按單詞逐個翻轉。
5.55. 右旋字符串(第八期模擬筆試)
package main
import "fmt"func main(){var target intvar str string fmt.Scanln(&target)fmt.Scanln(&str)runes := []rune(str)reverse(runes[:len(runes)])reverse(runes[0:target])reverse(runes[target:len(runes)])fmt.Println(string(runes))
}
func reverse(b []rune){left := 0right := len(b) - 1for left < right {b[left],b[right] = b[right],b[left]left++right--}
}
感悟:沒有任何難度,三次翻轉而已
6.28. 找出字符串中第一個匹配項的下標 - 力扣(LeetCode)
? ? ? ? ? ? ? ? 字符串匹配問題就要想到kmp
方法一:暴力解法就是遍歷他們的起始位置
func strStr(haystack string, needle string) int {n, m := len(haystack), len(needle)// 特殊情況:needle 為空字符串,返回 0(按題目約定)if m == 0 {return 0}// 若 haystack 長度小于 needle,直接返回 -1if n < m {return -1}// 遍歷所有可能的起始位置for i := 0; i <= n - m; i++ {// 檢查從 i 開始的子串是否與 needle 匹配match := truefor j := 0; j < m; j++ {if haystack[i+j] != needle[j] {match = falsebreak}}if match {return i}}// 未找到匹配return -1
}
方法二:KMP
func getNext(next []int,s string){j := 0 //最長公共前后綴next[0] = j//前綴表數組for i := 1;i<len(s);i++{for j>0 && s[i] != s[j]{j = next[j-1]}if s[i] == s[j]{j++}next[i] = j}
}func strStr(haystack string, needle string) int {n := len(needle)if n == 0{return 0}j := 0next := make([]int,n)getNext(next,needle)for i := 0;i<len(haystack);i++{for j > 0 && haystack[i] != needle[j]{j = next[j-1]//回退到前一位}if haystack[i] == needle[j]{j++}if j == n{return i - j +1}}return -1
}
感悟:kmp生疏了,但是簡單復習一遍之后,感覺更好理解了。
7.459. 重復的子字符串 - 力扣(LeetCode)
func repeatedSubstringPattern(s string) bool {n := len(s)if n == 0 {return false}j := 0next := make([]int, n)next[0] = jfor i := 1; i < n; i++ {for j > 0 && s[i] != s[j] {j = next[j-1]}if s[i] == s[j] {j++}next[i] = j}// next[n-1] 最長相同前后綴的長度if next[n-1] != 0 && n%(n-next[n-1]) == 0 {return true}return false
}
感悟:kmp的這兩個題確實都需要二刷了,第一個是字符串匹配的問題,第二個是字符串中是否出現重復子串。只不過第一個要建立next,然后利用模式串和文本串的不斷匹配去解決,j的含義不同。第二個相當于只建立next,然后通過next[n-1]去判斷是否是否重復出現。但是最后的那個判斷條件要熟能生巧。。。