go + 两次翻转
- 先转换成byte切片
- 大小写转换
- 整体翻转
- 找出每一个单词进行翻转
/**
*
* @param s string字符串
* @param n int整型
* @return string字符串
*/
func trans( s string , n int ) string {
// write code here
if n == 0 {
return s
}
bs := []byte(s)
// 对每一个byte进行大小写转换
for i, x := range bs {
bs[i] = transByte(x)
}
// 先整体翻转
for i, j := 0, n-1; i < j; i, j = i+1, j-1{
bs[i], bs[j] = bs[j], bs[i]
}
// 单词的开始、结束位置
start, end := 0, 0
// 再次翻转每一个单词
for end < n {
for end < n && bs[end] == ' ' {
end++
}
start = end
// 找到一个单词
for end < n && bs[end] != ' ' {
end++
}
// 翻转单词
reverseStr(bs, start, end-1)
// 找到空格
for end < n && bs[end] == ' ' {
end++
}
// 到这里已经是新的单词位置了
start = end
}
// 最后一个单词 这里 end == n, 所以需要end-1
// 单词翻转 start <= end-1 才说明需要翻转
if start <= end-1 {
reverseStr(bs, start, end-1)
}
return string(bs)
}
// 位置交换
func reverseStr(bs []byte, s, e int) {
for ; s < e ; s, e = s+1, e-1 {
bs[s], bs[e] = bs[e], bs[s]
}
}
// 大小写转换
func transByte(b byte) byte{
if b >= 'a' && b <= 'z' {
return b - ('a'-'A')
}else if b >= 'A' && b <= 'Z'{
return b + ('a'-'A')
}
return b
} 
京公网安备 11010502036488号