leetcode 151 反转字符串中的单词
给你一个字符串 s ,请你反转字符串中 单词 的顺序。
单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。
返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。
注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。
输入:s = "a good example"
输出:"example good a"
解释:如果两个单词间有多余的空格,反转后的字符串需要将单词间的空格减少到仅有一个。
class Solution(object):def reverseWords(self, s):arr = []word = ''for i in range(len(s)):if s[i] != ' ':word += s[i]else:if s[i - 1] != ' ' and word != '':arr.append(word)word = ''if word != '':newWord = word.replace(" ", "")arr.append(newWord)arr.reverse()print(arr)rstr = ' '.join(arr)return rstr
leetcode 238 除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。
题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。
请不要使用除法,且在 O(n) 时间复杂度内完成此题。
输入: nums =[1,2,3,4]
输出:[24,12,8,6]
class Solution(object):def productExceptSelf(self, nums):# 双指针ans = len(nums)*[1]left, right = 1, 1for i in range(len(nums)):ans[i] *= leftans[len(nums)-1-i] *= rightleft *= nums[i]right *= nums[len(nums)-1-i]return ans
不让用除法真是没有一点思路,参考了评论区大神,还是6啊
leetcode 334 递增的三元子序列
给你一个整数数组 nums ,判断这个数组中是否存在长度为 3 的递增子序列。
如果存在这样的三元组下标 (i, j, k) 且满足 i < j < k ,使得 nums[i] < nums[j] < nums[k] ,返回 true ;否则,返回 false 。
注意:三元组序列的下标可以不连续
输入:nums = [2,1,5,0,4,6]
输出:true
解释:三元组 (3, 4, 5) 满足题意,因为 nums[3] == 0 < nums[4] == 4 < nums[5] == 6
自己写的错误代码(71/79)
class Solution(object):def increasingTriplet(self, nums):matrix = [[nums[0]]]row = []for i in range(1, len(nums)):flag = 0for j in matrix:if j[-1] < nums[i]:j.append(nums[i])flag = 1if flag == 0:row.append(nums[i])matrix.append(row)row = []for j in matrix:if len(j) >= 3:return Truereturn False
维护两个变量first=nums[0], second趋于正无穷
贪心:在first<second的前提下,两个数都尽可能的小,这样找到递增三元子序列的可能性更大
官方题解:
class Solution(object):def increasingTriplet(self, nums):first, second = nums[0], float('inf')n = len(nums)if n < 3:return Falsefor i in range(1, n):if nums[i] > second:return Trueif nums[i] > first:second = nums[i] # 让second尽可能小if nums[i] < first:first = nums[i]return False