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
}
}