题目描述:
Given a string, you need to reverse the order of characters in each word within a sentence while still preserving whitespace and initial word order.
Example 1:
Input: "Let's take LeetCode contest" Output: "s'teL ekat edoCteeL tsetnoc"
Note: In the string, each word is separated by single space and there will not be any extra space in the string.
代码实现(个人版):
1 class Solution: 2 def reverseWords(self, s: str) -> str: 3 b = [] # 首先定义一个空的list,用于存放翻转后的字符串 4 length = len(s) # 统计原字符串的长度,便于后续使用 5 left, right = 0, 0 # 在大多数情况下,[left, right-1]之间的字符是用于翻转的字符 6 while right < length: # 当right抵达字符串的右边界(即最后一个字符时)循环结束 7 if s[right] != " " and right != length-1: # 如果right没有抵达空格或最后一个字符时 8 right += 1 # 每次都让right向右移动一个位置,去检测下一个字符 9 else: # 如果right抵达了空格或最后一个字符 10 if right == length - 1: # 首先要判断是抵达了空格还是抵达了最后一个字符,因为这两种情况下right所指向的值是不一样的(一个是空格,一个是字符) 11 b.append(s[right-length:left-length-1:-1]) # 如果right抵达的是最后一个字符,则要翻转的区间是s[right-length:left-length-1], 12 # 注意如果一个字符是在字符串中正数的第i个位置,那么它在倒数时位于第(i-length)个位置, 13 # 其中length是字符串的长度。 14 # 为什么区间的右边取的是left-length-1而非left-length?是因为left-length处是开区间(根 15 # 据区间的左闭右开原则),因此要想取到第left-length个元素,区间必须再向前伸展一位。 16 else: 17 b.append(s[right-length-1:left-length-1:-1]) # 如果抵达的不是一个字符,而是一个空格处,则首先要让右端点向前挪一位,让它指向空格之前 18 # 的最后一个元素(即right-1),然后再计算它在逆序中的位置(即right-length-1)。 19 b.append(" ") # 此时还要再该单词的后面人为地加一个空格 20 # 以上的一次循环称为一次操作 21 right += 1 # 在一次操作完成后,无论right指向的是一个空格还是最后一个元素,都让right向右挪一位 22 left = right # 然后让left指向一个新的单词的开头或是越界(将导致循环结束) 23 c = ''.join(b) # 在整个while循环结束之后,b中存放的是由逆序单词和空格组成的分立的元素,此时要用join()方法将其连接成一个字符串 24 return c 25 26 if __name__ == '__main__': 27 aa = "Let's take LeetCode contest" 28 bb = Solution().reverseWords(aa) 29 print(bb)
实现思路(个人版):
核心思想是利用Python的list进行逆序输出。
参考资料:
[1] 如何list中的元素进行逆序输出:https://blog.csdn.net/dpengwang/article/details/79230912
[2] 如何将一个列表里面的元素拼接成字符串:https://www.cnblogs.com/lowmanisbusy/p/10212465.html
https://blog.csdn.net/weixin_38128649/article/details/82960935
大神做法:
1 class Solution: 2 def reverseWords(self, s: str) -> str: 3 return ' '.join([word[::-1] for word in s.split(' ')])
split()函数的用法:https://www.runoob.com/python/att-string-split.html
s原来是字符串,split之后得到的是若干个没有空格的小字符串,然后对每一个小字符串都将它完全逆序但是小字符串之间的顺序并没有改变。由于是用中括号括起来的,所以逆序之后得到的是一个list,里边的元素皆为字符串。最后用join()方法以空格来连接这些字符串,即可达到目的。(join只会在字符串之间相连,不会在末尾添加字符串。)
因此总体的思路是:先分——逆序——再合。