344.反转字符串
让j代表左边,i代表右边
然后开始互换即可
func reverseString(s []byte) {
n:=len(s)
j:=0
for i:=n-1;i>0;i--{
if (j<i){
temp:=s[i]
s[i]=s[j]
s[j]=temp
j++
}
}
}
func reverseString(s []byte) {
left:=0
right:=len(s)-1
for left<right{
s[left],s[right]=s[right],s[left]
left++
right--
}
}
541. 反转字符串II
给定一个字符串 s 和一个整数 k,从字符串开头算起, 每计数至 2k 个字符,就反转这 2k 个字符中的前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
示例:
输入: s = "abcdefg", k = 2
输出: "bacdfeg"
#
Go语言遍历字符串 一般可以把string转化成[]byte{}数组
其实在遍历字符串的过程中,只要让 i += (2 * k),i 每次移动 2 * k 就可以了,然后判断是否需要有反转的区间。再用slice就可以解决了
func reverseStr(s string, k int) string {
ss := []byte(s)
length:=len(s)
for i:=0;i<length;i+=2*k {
if i+k <= length {
reverseString(ss[i:i+k])
} else {
reverseString(ss[i:length])
}
}
return string(ss)
}
func reverseString(s []byte) {
left:=0
right:=len(s)-1
for left<right{
s[left],s[right]=s[right],s[left]
left++
right--
}
}
题目:剑指Offer 05.替换空格
请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
示例 1: 输入:s = "We are happy."
输出:"We%20are%20happy."
#
最高性能方法,原地修改
func replaceSpace(s string) string {
b := []byte(s)
length := len(b)
spaceCount := 0
// 计算空格数量
for _, v := range b {
if v == ' ' {
spaceCount++
}
}
// 扩展原有切片
resizeCount := spaceCount * 2
tmp := make([]byte, resizeCount)
b = append(b, tmp...)
i := length - 1
j := len(b) - 1
for i >= 0 {
if b[i] != ' ' {
b[j] = b[i]
i--
j--
} else {
b[j] = '0'
b[j-1] = '2'
b[j-2] = '%'
i--
j = j - 3
}
}
return string(b)
}
151.翻转字符串里的单词
给定一个字符串,逐个翻转字符串中的每个单词。
示例 1:
输入: "the sky is blue"
输出: "blue is sky the"
示例 2:
输入: " hello world! "
输出: "world! hello"
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
示例 3:
输入: "a good example"
输出: "example good a"
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
先上一个自己写的方法:
func reverseWords(s string) string {
ss := []byte(s)
fmt.Println(ss)
m := map[int]string{}
j := 0
temp := ""
for i := len(ss) - 1; i >= 0; i-- {
if ss[i] != ' ' {
temp += string(ss[i])
if i == 0 {
j++
btmp := []byte(temp)
reverseString(btmp)
m[j] = string(btmp)
}
} else {
if len(m[j]) == 0 && i != len(ss)-1 && ss[i+1] != ' ' {
btmp := []byte(temp)
reverseString(btmp)
m[j] = string(btmp)
temp = ""
j++
}
}
}
fmt.Println(m)
var str string
keys := make([]int, 0)
for k, _ := range m {
keys = append(keys, k)
}
sort.Ints(keys)
for q, k := range keys {
str += m[k]
if q != len(keys) -1 {
str += " "
}
}
return str
}
func reverseString(s []byte) {
left := 0
right := len(s) - 1
for left < right {
s[left], s[right] = s[right], s[left]
left++
right--
}
}
这个方法主要就是从尾部开始遍历,遇到空格,就把前面的词保存起来。用map。需要主要到最后一个单词的条件判断以及多个空格的条件判断,当然还有一个就是go map的特性,遍历的时候,排序是随机的,需要把key先用slice排序一下,再根据key的顺序,遍历map,最后字符串拼接。后面再补上大佬的写法
#题目:剑指Offer58-II.左旋转字符串
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
示例 1:
输入: s = "abcdefg", k = 2
输出: "cdefgab"
示例 2:
输入: s = "lrloseumgh", k = 6
输出: "umghlrlose"
限制:
1 <= k < s.length <= 10000
#
func reverseLeftWords(s string, n int) string {
ss := []byte(s)
sub1 := ss[0:n]
sub2 := ss[n : len(ss)-1]
sub3 := ss[len(ss)-1]
var str []string
str = append(str, string(sub2), string(sub3), string(sub1))
return strings.Join(str, "")
}
28. 实现 strStr()
实现 strStr() 函数。
给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。
示例 1: 输入: haystack = "hello", needle = "ll" 输出: 2
示例 2: 输入: haystack = "aaaaa", needle = "bba" 输出: -1
说明: 当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。 对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与C语言的 strstr() 以及 Java的 indexOf() 定义相符。
KMP算法