LeetCode,反转字符串中的单词 III

122 阅读4分钟

这是我参与2022首次更文挑战的第26天,活动详情查看:2022首次更文挑战

一、写在前面

LeetCode 第一题两数之和传输门:听说你还在写双层for循环解两数之和?

LeetCode 第二题两数之和传输门:两个排序数组的中位数,“最”有技术含量的解法!

LeetCode 第三题最长回文子串传输门:马拉车算法解最长回文子串!Manacher

LeetCode 第四题字符串转整数 (atoi):“愚公移山”的方法解atoi,自以为巧妙!

LeetCode 第五题最长公共前缀:继续解Leetcode,最长公共前缀

LeetCode 第六题三数之和:Leetcode“最经典”算法题之一:三数之和

LeetCode 第七题最接近的三数之和:最接近的三数之和,妙

LeetCode 第八题有效的括号:Leetcode有意思的一题:有效的括号

LeetCode 第九题删除排序数组中的重复项:LeetCode之删除排序数组中的重复项

LeetCode 第十题盛最多水的容器:盛最多水的容器,超有意思有技巧的Leetcode题

LeetCode 第十一题字符串相乘:Leetcode字符串相乘,你会怎么做?

LeetCode 第十二题反转字符串:Leetcode反转字符串,我又投机取巧啦!

今天给大家分享的是LeetCode 数组与字符串 第十三题:反转字符串中的单词 III,为面试而生,期待你的加入。 “Use the utility in the API is recommended in the project. But if you use it in an interview, you will definitely fail .”

二、今日题目

给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。

示例:

输入: "Let's take LeetCode contest"
输出: "s'teL ekat edoCteeL tsetnoc" 

注意: 在字符串中,每个单词由单个空格分隔,并且字符串中不会有任何额外的空格。

三、 分析

这个题目,看到第一眼,感觉有点难,我一看到题目,还以为是一个字符串里有英文单词,只用识别英文单词,然后把英文单词逆转就好,后来仔细一看,是一段只由英文单词和空格组成的字符串,这样的话,就简单了很多,具体思路如下图所述:

思路

四、解题

1.快捷的方法:

时间复杂度:O(n) 毕竟还是得把每个单词都遍历一遍~

class Solution(object):
	def reverseWords(self, s):
		"""
		:type s: str
		:rtype: str
		"""
		# 根据空格,把字符串分隔开
		r_list = s.split(" ")
		
		# 把列表每个单词字符串逆转
		for i in range(len(r_list)):
			r_list[i] = r_list[i][::-1]
		
		# 用 “ ” 连接列表的每个单词
		result_s = " ".join(r_list)
		return result_s

(1)切片/join操作,前一篇Python小知识,这些技能你不会?(一)有较详细介绍。

(2)split函数

Python split((str, num) 通过指定分隔符对字符串进行切片,如果参数 num 有指定值,则仅分隔 num 个子字符串。 参数介绍:

str -- 分隔符,默认为所有的空字符,包括空格、换行(\n)、制表符(\t)等。
num -- 分割次数。

(3)提交结果 提交结果

测试数据:30组
运行时间:32ms
击败人百分比:94.56%

2.自己动手,丰衣食足?

遍历,分组都自己动手实现,比较麻烦,首先需要将字符串按空格进行分割,变成一个个单词,然后依次处理每个单词,处理好后还需要将解决合并成一个字符串,相当于需要三次遍历。

时间复杂度:O(n)

class Solution(object):
	def reverseWords(self, s):
		"""
		:type s: str
		:rtype: str
		"""
		# 根据空格,把字符串分隔开
		s = s + ' '
		r_list = []
		word = ''
		flag = 0
		for i in s:
			if i != " ":
				word = word + i
				flag = 1
			else:
				if flag == 1:
					r_list.append(word)
					word = ''
					flag = 0
		
		# 把列表每个单词字符串逆转
		for i in range(len(r_list)):
			r_list[i] = self.reverseString(r_list[i])
			
		# 用 “ ” 连接列表的每个单词
		result_s = ''
		for i in range(len(r_list)):
			if i == len(r_list)-1:
				result_s = result_s + r_list[i]
				break
			result_s = result_s + r_list[i] + " "
		
		return result_s
	
	# leetcode12中自己实现字符串逆转
	def reverseString(self, s):
		"""
		:type s: str
		:rtype: str
		"""
		result = list(s)
		for i in range(len(result)//2):
			temp = result[len(result)-i-1]
			result[len(result)-i-1] = result[i]
			result[i] = temp
		return ''.join(result)
  • 提交结果 提交结果

测试数据:30组
运行时间:204ms
击败人百分比:2.89%

虽然beat的人不多,但我有想法,我骄傲啊~

感觉很酷,感觉很努力,现实很残酷,有没有这种感觉?

五、结语

坚持 and 努力 : 终有所获。

点赞 在看 留言 转发 ,四连支持,原创不易。好的,那么下期见,我是爱猫爱技术,更爱思思的老表⁽⁽ଘ( ˙꒳˙ )ଓ⁾⁾