0215leetcode刷题5道python

171

题目描述:
给定一个Excel表格中的列名称,返回其相应的列序号。
例如,
A -> 1
B -> 2
C -> 3

Z -> 26
AA -> 27
AB -> 28

示例:
0215leetcode刷题5道python_第1张图片
解答:

class Solution:
    def titleToNumber(self, s: str) -> int:
        #26进制转10进制
        ans = 0
        for x in s:
            ans *= 26
            ans += ord(x)-ord('A')+1
        return ans

239

题目描述:
给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。
返回滑动窗口中的最大值。

示例:
0215leetcode刷题5道python_第2张图片

解答:

class Solution:
    def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
        win, ret = [], []
        for i, v in enumerate(nums):
            if i >= k and win[0] <= i - k: 
                win.pop(0)
            while win and nums[win[-1]] <= v: 
                win.pop()
            win.append(i)
            if i >= k - 1: 
                ret.append(nums[win[0]])
        return ret

448

题目描述:
给定一个范围在 1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次。
找到所有在 [1, n] 范围之间没有出现在数组中的数字。
您能在不使用额外空间且时间复杂度为O(n)的情况下完成这个任务吗? 你可以假定返回的数组不算在额外空间内。

示例:
0215leetcode刷题5道python_第3张图片
解答:

class Solution:
    def findDisappearedNumbers(self, nums: List[int]) -> List[int]:
        '''
        将所有正数作为数组下标,置对应数组值为负值。
        那么,仍为正数的位置即为(未出现过)消失的数字。
        '''
        for num in nums:
            nums[abs(num)-1] = -abs(nums[abs(num)-1])
        print(nums)
        return [i+1 for i,num in enumerate(nums) if num>0]

765

题目描述:
N 对情侣坐在连续排列的 2N 个座位上,想要牵到对方的手。 计算最少交换座位的次数,以便每对情侣可以并肩坐在一起。 一次交换可选择任意两人,让他们站起来交换座位。
人和座位用 0 到 2N-1 的整数表示,情侣们按顺序编号,第一对是 (0, 1),第二对是 (2, 3),以此类推,最后一对是 (2N-2, 2N-1)。
这些情侣的初始座位 row[i] 是由最初始坐在第 i 个座位上的人决定的。

示例:
0215leetcode刷题5道python_第4张图片
解答:

class Solution:
    def minSwapsCouples(self, row: List[int]) -> int:
        """
        每两个座位成一对,假定左边的人都是合法的不变,如果TA右边的人与TA匹配则
        跳过,不匹配则找到TA的匹配对象的与TA右边的人交换。
        """
        def find_another(n):
            if n % 2 == 0:
                return n + 1
            else:
                return n - 1

        c = 0
        for i in range(0, len(row), 2):
            p1 = row[i]
            p2 = find_another(p1)
            if row[i+1] != p2:
                j = row.index(p2)
                row[i+1], row[j] = row[j], row[i+1]
                c += 1

        return c

剑指offer59-II

题目描述:
请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。
若队列为空,pop_front 和 max_value 需要返回 -1

示例:
0215leetcode刷题5道python_第5张图片
解答:

class MaxQueue:

    def __init__(self):
        self.queue = []
        self.maxq = []


    def max_value(self) -> int:
        if not self.maxq:
            return -1
        return self.maxq[0]


    def push_back(self, value: int) -> None:
        self.queue.append(value)

        while self.maxq and self.maxq[-1] < value:
            self.maxq.pop()
        self.maxq.append(value)


    def pop_front(self) -> int:
        if not self.queue:
            return -1
        v = self.queue.pop(0)
        if v == self.maxq[0]:
            self.maxq.pop(0)
        return v



# Your MaxQueue object will be instantiated and called as such:
# obj = MaxQueue()
# param_1 = obj.max_value()
# obj.push_back(value)
# param_3 = obj.pop_front()

你可能感兴趣的:(leetcode,python)