1.1. 题目

1.1.1. 反转字符串中的单词 III

给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。

示例 1:

输入: "Let's take LeetCode contest"
输出: "s'teL ekat edoCteeL tsetnoc"

注意:在字符串中,每个单词由单个空格分隔,并且字符串中不会有任何额外的空格。




1.1.2. 题解:

  • 字符串以空格为分隔符,空格不可能多个在一起,所以可以考虑用空来判断
  • 不是整体反转,而且每个单词进行反转,整体顺序不变
  • 有可能就一个单词,没有空格
  • 也有可能开头就空格?

1.1.3. 思路:

  • 第一反应是不用内置函数,可以先写一个反转函数,然后用空格做分隔符,空格前单词进行反转,然后把每个相加
  • 注意最后可能没有空格,所以别遗漏了最后一个单词

1.1.4. 代码:

点击显示
func reverseWords(s string) string {
    // 如果为空,直接返回
    if s == "" || s == " " {
        return ""
    }
    // 如果开头为空,直接去除开头为空的,形成新的字符串
    if string(s[0]) == " " {
        s = s[1:]
    }
    // 获取字符串长度,莫要再for循环里获取,因为那样会有性能消耗
    strLen := len(s)
    if strLen == 0 {
        return ""
    }
    // 定义一个字符串节点,初始默认为0,每当遇到空字符串,就将 end到i的字符串进行反转,然后将i+1赋值给end,以方便获取下一个字符串
    end := 0
    // 定义返回的字符串
    var str string
    for i:=0;i<strLen;i++ {
        // 如果是第一个字符串,区别在于要不要加个空格
        if end == 0 {
            // 如果遇到空字符串,进行反转,并将end赋值i+1
            if string(s[i]) == " " {
                str = str + reverse(s[end:i])
                end = i + 1
            }
            // 如果循环到末尾了,把最后一个字符串进行反转
            if i == strLen - 1 {
                str = str + reverse(s[end:])
            }
        } else { // 如果不是第一个字符串
          // 如果遇到空字符串,进行反转,并将end赋值i+1
            if string(s[i]) == " " {
                str = str + " " + reverse(s[end:i])
                end = i + 1
            }
            // 如果循环到末尾了,把最后一个字符串进行反转
            if i == strLen - 1 {
                str = str + " " + reverse(s[end:])
            }
        }


    }
    return str
}


func reverse(str string) string {
    strLen := len(str)

    var s,e string
    for i:=0;i<strLen/2;i++ {
        a := str[i]
        b := str[strLen-i-1]
        // 反转两个字符
        a,b = b,a
        // 拼凑字符
        s = s + string(a)
        e = string(b) + e
    }

    // 根据长度 拼凑字符串返回
    if strLen%2 == 0 {
        return s + e
    } else {
        return s + string(str[strLen/2]) + e
    }


}

代码

results matching ""

    No results matching ""