这是基于代码随想录的每日打卡
151. 反转字符串中的单词
给你一个字符串
s
,请你反转字符串中 单词 的顺序。单词 是由非空格字符组成的字符串。
s
中使用至少一个空格将字符串中的 单词 分隔开。返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。
**注意:**输入字符串
s
中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。
示例 1:
输入:s = "the sky is blue"
输出:"blue is sky the"
示例 2:
输入:s = " hello world "
输出:"world hello"
解释:反转后的字符串中不能存在前导空格和尾随空格。
示例 3:
输入:s = "a good example"
输出:"example good a"
解释:如果两个单词间有多余的空格,反转后的字符串需要将单词间的空格减少到仅有一个。
思路一
用split
库函数分开每个单词,再翻转
代码
class Solution:
def reverseWords(self, s: str) -> str:
return ' '.join(s.split()[::-1])
运行结果
思路二
先把全部字符整体翻转,再用split分开每个单词,再对里面的每个小单词进行翻转
代码
class Solution:
def reverseWords(self, s: str) -> str:
# 反转整个字符串
s = s[::-1]
# 将字符串拆分为单词,并反转每个单词
# split()函数能够自动忽略多余的空白字符
s = ' '.join(word[::-1] for word in s.split())
return s
运行结果
思路三:双指针
-
先将每个单词分开,再用两个指针指向头和尾
-
头指针和尾指针分别向右和左同时移动,同时交换对应位置的元素
代码
class Solution:
def reverseWords(self, s: str) -> str:
words=s.split() #分割单词
left,right=0,len(words)-1 #左右指针
while left<right: # 两指针相遇则结束循环
words[left],words[right]=words[right],words[left]
left+=1
right-=1
return ' '.join(words)
运行结果
思路四
这个思路尝试不用split函数的做法,先移除多余的空格,再将由空格分割的每个单词添加进列表,再逆序输出
代码
class Solution:
def reverseWords(self, s: str) -> str:
fast=0
res=''
# 移除空格
while fast<len(s):
if s[fast]!=' ': # 发现字符,准备加进res
# 准备将每部分完整的单词加进去
# 注意:需要先判断fast<len(s),因为s[fast]的话索引会先越界报错
while fast<len(s) and s[fast]!=' ' :
res+=s[fast]
fast+=1 # 指针继续移动
res+=' ' # 在每个单词后面末尾加一个空格
else:
# 跳过所有连续的空格
while fast<len(s) and s[fast]==' ':
fast+=1
# 由于上面的逻辑把所有的单词后面都加了一个空格,所以我们把最后一个单词后面的空格删掉
res=res[:-1]
# 下面是将每个单词添加进列表的操作
res_li=[]
cur=0
word='' # 用于存放每个单词
while cur<len(res):
if res[cur]!=' ': # 如果遇见字符则开始存放
while cur<len(res) and res[cur]!=' ':
word+=res[cur]
cur+=1
res_li.append(word)
word='' #清空以便存放下一个单词
else:
cur+=1
return ' '.join(res_li[::-1])
运行结果
55. 右旋字符串(第八期模拟笔试)
题目描述
字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k,请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。
例如,对于输入字符串 “abcdefg” 和整数 2,函数应该将其转换为 “fgabcde”。
输入描述
输入共包含两行,第一行为一个正整数 k,代表右旋转的位数。第二行为字符串 s,代表需要旋转的字符串。
输出描述
输出共一行,为进行了右旋转操作后的字符串。
输入示例
2
abcdefg
输出示例
fgabcde
思路一
-
我们可以将不用旋转的字符和要旋转的字符分为两个子字符串
-
再将两个子字符串整体翻转
python中字符串是不可变的,所以需要额外空间
代码
n=int(input())
strs=input()
s=strs[len(strs)-n:]+strs[:len(strs)-n]
print(s)
运行结果
思路二
- 我们还可以先将字符串整个进行翻转
- 再将两个子字符串进行局部翻转
代码
n=int(input())
strs=input()
s_list=list(strs)
s_list=s_list[::-1]
print(''.join(s_list[:n][::-1]+s_list[n:][::-1]))
运行结果