Python算法练习6.25

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, 1
        for i in range(len(nums)):
            ans[i] *= left
            ans[len(nums)-1-i] *= right
            left *= 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 = 0
            for j in matrix:
                if j[-1] < nums[i]:
                    j.append(nums[i])
                    flag = 1
            if flag == 0:
                row.append(nums[i])
                matrix.append(row)
                row = []
        for j in matrix:
            if len(j) >= 3:
                return True
        return False

维护两个变量first=nums[0], second趋于正无穷

贪心:在first

官方题解:

class Solution(object):
    def increasingTriplet(self, nums):
        first, second = nums[0], float('inf')
        n = len(nums)
        if n < 3:
            return False
        for i in range(1, n):
            if nums[i] > second:
                return True
            if nums[i] > first:
                second = nums[i] # 让second尽可能小
            if nums[i] < first:
                first = nums[i]
        return False

你可能感兴趣的:(算法练习,python,算法,开发语言)