题目
反转字符串
解析
难点有两个
- 将字符串格式化成 [a b c] 的形式
- 将字符串整体反转后按单词反转
伪代码
格式化的时候,采用快慢指针,f指针进行便利,s指针进行append。append 的条件是,这个是字符,或者这个空格前是字符。
当循环结束后,末尾可能多出一个空格。进行判断取消
for f < len
if isChar(f) || (isSpace(f) && isChar(f-1))
s++
s[s] = s[f]
f++
if isSpace(s)
s--
return s[:s]
反转字符串,首先全局反转,然后截取其中的单词逐个反转。在一个切片上,如果以游标i,j的形式确定要反转该段,则固定的编码为。stp 为要交换的次数。
for stp:=0;stp<=(j-i)/2; stp++
s[i+stp], s[j-stp] = s[j-stp], s[i+stp]
代码
func reverseWords(s string) string {
s = format(s)
return reverse(s)
}
func format(s string) string {
bs := []byte(s)
end:=-1
i :=0
for i<len(bs) {
// 如果一个数字是字符,或者一个空格前是字符,则将该字符填入 end 里,否则
if bs[i] != ' ' || (bs[i] == ' ' && i != 0 && bs[i-1] != ' ') {
end++
bs[end] = bs[i]
}
i++
}
if bs[end] == ' ' {
end--
}
return string(bs[:end+1])
}
func reverse(s string) string {
bs := []byte(s)
for stp:=0;stp<=(len(bs)-1)/2;stp++ {
bs[stp], bs[len(bs)-1-stp] = bs[len(bs)-1-stp], bs[stp]
}
i:=0
for i<len(bs) {
j:=i
for j<len(bs)-1 && bs[j+1] != ' ' {
j++
}
for stp := 0; stp<=(j-i)/2; stp++{
bs[i+stp], bs[j-stp] = bs[j-stp], bs[i+stp]
}
i=j+2
}
return string(bs)
}
image.png