美文网首页
151. Reverse Words in a String

151. Reverse Words in a String

作者: sarto | 来源:发表于2022-09-15 21:58 被阅读0次

题目

反转字符串

解析

难点有两个

  1. 将字符串格式化成 [a b c] 的形式
  2. 将字符串整体反转后按单词反转

伪代码

格式化的时候,采用快慢指针,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

相关文章

网友评论

      本文标题:151. Reverse Words in a String

      本文链接:https://www.haomeiwen.com/subject/occsortx.html