方法一:

思路:双指针对撞的思想

  1. //思路:双指针进行对撞的思想,左边指针指向一个字母,右边指针指向一个字母
  2. func reverseOnlyLetters(s string) string {
  3. //转换为byte数组
  4. sTemp := []byte(s)
  5. //l指向左侧字母,r指向右侧字母
  6. l, r := 0, len(s)-1
  7. for l < r {
  8. //不断循环让l指向左侧字母
  9. for l <= len(s)-1 && !unicode.IsLetter(rune(s[l])) {
  10. l++
  11. }
  12. //不断循环让r指向右侧字母
  13. //注意判断r没有越界
  14. for r >= 0 && !unicode.IsLetter(rune(s[r])) {
  15. r--
  16. }
  17. if l >= len(s) || r < 0 || l >= r {
  18. break
  19. }
  20. //交换l与r
  21. sTemp[l], sTemp[r] = sTemp[r], sTemp[l]
  22. //然后改变l与r
  23. l++
  24. r--
  25. }
  26. return string(sTemp)
  27. }

对上面的代码进行改进之后的代码:

  1. //对上面代码进行优化
  2. func reverseOnlyLetters(s string) string {
  3. //转换为byte数组
  4. sTemp := []byte(s)
  5. //l指向左侧字母,r指向右侧字母
  6. l, r := 0, len(s)-1
  7. for l < r {
  8. //不断循环让l指向左侧字母
  9. for l < r && !unicode.IsLetter(rune(s[l])) {
  10. l++
  11. }
  12. //不断循环让r指向右侧字母
  13. //注意判断r没有越界
  14. for r > l && !unicode.IsLetter(rune(s[r])) {
  15. r--
  16. }
  17. if l >= r {
  18. break
  19. }
  20. //交换l与r
  21. sTemp[l], sTemp[r] = sTemp[r], sTemp[l]
  22. //然后改变l与r
  23. l++
  24. r--
  25. }
  26. return string(sTemp)
  27. }