Python每日一练(20230326)

简介: Python每日一练(20230326)

1. 数据流的中位数


中位数是有序列表中间的数。如果列表长度是偶数,中位数则是中间两个数的平均值。


例如,

[2,3,4] 的中位数是 3

[2,3] 的中位数是 (2 + 3) / 2 = 2.5

设计一个支持以下两种操作的数据结构:

   void addNum(int num) - 从数据流中添加一个整数到数据结构中。

   double findMedian() - 返回目前所有元素的中位数。


示例:

addNum(1)
addNum(2)
findMedian() -> 1.5
addNum(3)  
findMedian() -> 2

进阶:

   如果数据流中所有整数都在 0 到 100 范围内,你将如何优化你的算法?

   如果数据流中 99% 的整数都在 0 到 100 范围内,你将如何优化你的算法?


出处:

https://edu.csdn.net/practice/23818932

代码:


class MedianFinder(object):
    def __init__(self):
        """
        initialize your data structure here.
        """
        self.array = []
    def addNum(self, num):
        """
        :type num: int
        :rtype: None
        """
        self.array.append(num)
    def findMedian(self):
        """
        :rtype: float
        """
        self.array.sort()
        n = len(self.array)
        if n % 2 == 1:
            return self.array[n // 2]
        else:
            return (self.array[n // 2] + self.array[n // 2 - 1]) / 2.0
        # Your MedianFinder object will be instantiated and called as such:
        # obj = MedianFinder()
        # obj.addNum(num)
        # param_2 = obj.findMedian()
# %%
obj = MedianFinder()
obj.addNum(1)
obj.addNum(2)
print(obj.findMedian())
obj.addNum(3) 
print(obj.findMedian())

输出:

1.5

2


2. 罗马数字转整数


罗马数字包含以下七种字符: IVXLCDM


字符          数值

I             1

V             5

X             10

L             50

C             100

D             500

M             1000

例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做  XXVII, 即为 XX + V + II 。


通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:


   I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。

   X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。  

   C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。


给你一个罗马数字,将其转为整数。


示例 1:

输入: "III"

输出: num = 3


示例 2:

输入: "IV"

输出: num = 4


示例 3:

输入: "IX"

输出: num = 9


示例 4:

输入: "LVIII"

输出: num = 58

解释: L = 50, V = 5, III = 3.


示例 5:

输入: "MCMXCIV"

输出: num = 1994

解释: M = 1000, CM = 900, XC = 90, IV = 4.


提示:

   1 <= num <= 3999


出处:

https://edu.csdn.net/practice/23818933

代码:


class Solution:
    def romanToInt(self, s: str) -> int:
        units = [
            ["M", 1000, 1],
            ["CM", 900, 2],
            ["D", 500, 1],
            ["CD", 400, 2],
            ["C", 100, 1],
            ["XC", 90, 2],
            ["L", 50, 1],
            ["XL", 40, 2],
            ["X", 10, 1],
            ["IX", 9, 2],
            ["V", 5, 1],
            ["IV", 4, 2],
            ["I", 1, 1]
        ]
        end = len(s)
        start = 0
        i = 0
        r = 0
        while i < len(units):
            unit = units[i][0]
            value = units[i][1]
            step = units[i][2]
            if end-start >= step and s[start:start+step] == unit:
                r += value
                start += step
            else:
                i += 1
        return r
# %%
s = Solution()
print(s.romanToInt("III"))
print(s.romanToInt("IV"))
print(s.romanToInt("IX"))
print(s.romanToInt("LVIII"))
print(s.romanToInt("MCMXCIV"))

输出:

3

4

9

58

1994

代码2: dict 把原题中的units列表改为字典形式

class Solution:
    def romanToInt(self, s: str) -> int:
        units = {
            "M": 1000,  "CM": 900,  "D": 500,   "CD": 400,
            "C": 100,   "XC": 90,   "L": 50,    "XL": 40,
            "X": 10,    "IX": 9,    "V": 5,     "IV": 4,
            "I": 1
        }
        res, i, j = 0, 0, 0
        roman = list(units)
        while i < len(units):
            unit = roman[i]
            step = len(unit)
            if j+step <= len(s) and s[j:j+step] == unit:
                res += units.get(unit)
                j += step
            else:
                i += 1
        return res
# %%
s = Solution()
print(s.romanToInt("III"))
print(s.romanToInt("IV"))
print(s.romanToInt("IX"))
print(s.romanToInt("LVIII"))
print(s.romanToInt("MCMXCIV"))






3. 插入区间


给你一个 无重叠的按照区间起始端点排序的区间列表。


在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。

示例 1:

输入:intervals = [[1,3],[6,9]], newInterval = [2,5]

输出:[[1,5],[6,9]]


示例 2:

输入:intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8]

输出:[[1,2],[3,10],[12,16]]

解释:这是因为新的区间 [4,8] 与 [3,5],[6,7],[8,10] 重叠。


示例 3:

输入:intervals = [], newInterval = [5,7]

输出:[[5,7]]


示例 4:

输入:intervals = [[1,5]], newInterval = [2,3]

输出:[[1,5]]


示例 5:

输入:intervals = [[1,5]], newInterval = [2,7]

输出:[[1,7]]


提示:

   0 <= intervals.length <= 10^4

   intervals[i].length == 2

   0 <= intervals[i][0] <= intervals[i][1] <= 10^5

   intervals 根据 intervals[i][0] 按 升序 排列

   newInterval.length == 2

   0 <= newInterval[0] <= newInterval[1] <= 10^5


出处:

https://edu.csdn.net/practice/23818934

代码:


class Interval(object):
    def __init__(self, s=0, e=0):
        self.start = s
        self.end = e
class Solution(object):
    def list2interval(self, list_interval):
        ret = []
        for i in list_interval:
            interval = Interval(i[0], i[1])
            ret.append(interval)
        return ret
    def interval2list(self, interval):
        ret = []
        x = [0,0]
        for i in interval:
            x[0] = i.start
            x[1] = i.end
            ret.append(x)
            x = [0,0]
        return ret
    def insert(self, intervals, newInterval):
        """
        :type intervals: List[Interval]
        :type newInterval: Interval
        :rtype: List[Interval]
        """
        if intervals is None or len(intervals) == 0:
            return [newInterval]
        intervals = self.list2interval(intervals)
        newInterval = Interval(newInterval[0], newInterval[1])
        intervals.sort(key=lambda x:x.start)
        pos = 0
        while pos < len(intervals):
            if newInterval.end < intervals[pos].start:
                intervals.insert(pos, newInterval)
                intervals = self.interval2list(intervals)
                return intervals
            if self.check_overlap(intervals[pos], newInterval):
                temp = intervals.pop(pos)
                newInterval = self.merge_intervals(temp, newInterval)
            else:
                pos += 1
        if len(intervals) == 0 or pos == len(intervals):
            intervals.append(newInterval)
        intervals = self.interval2list(intervals)
        return intervals
    def check_overlap(self, curr_int, new_int):
        if curr_int.start <= new_int.start:
           if curr_int.end > new_int.start:
               return True
        else:
            if curr_int.start <= new_int.end:
                return True
        return False
    def merge_intervals(self, int1, int2):
        temp_int = Interval()
        temp_int.start = min([int1.start, int2.start])
        temp_int.end = max([int1.end, int2.end])
        return temp_int
# %%
s = Solution()
print(s.insert(intervals = [[1,3],[6,9]], newInterval = [2,5]))
print(s.insert(intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8]))
print(s.insert(intervals = [], newInterval = [5,7]))
print(s.insert(intervals = [[1,5]], newInterval = [2,3]))
print(s.insert(intervals = [[1,5]], newInterval = [2,7]))




输出:

[[1, 5], [6, 9]]

[[1, 2], [3, 10], [12, 16]]

[[5, 7]]

[[1, 5]]

[[1, 7]]






目录
相关文章
|
Python 人工智能
讯飞星火、文心一言和通义千问同时编“贪吃蛇”游戏,谁会胜出?
讯飞星火、文心一言和通义千问同时编“贪吃蛇”游戏,谁会胜出?
247 1
讯飞星火、文心一言和通义千问同时编“贪吃蛇”游戏,谁会胜出?
|
Shell Unix Linux
Linux 终端命令之文件浏览(3) less
Linux 终端命令之文件浏览(3) less
173 0
Linux 终端命令之文件浏览(3) less
|
Rust
Rust 编程小技巧摘选(8)
Rust 编程小技巧摘选(8)
373 0
Rust 编程小技巧摘选(8)
|
算法 C++ 机器人
力扣 C++|一题多解之动态规划专题(1)
力扣 C++|一题多解之动态规划专题(1)
131 0
力扣 C++|一题多解之动态规划专题(1)
|
C++ Python 索引
Python Numpy入门基础(二)数组操作
Python Numpy入门基础(二)数组操作
187 0
Python Numpy入门基础(二)数组操作
|
C++ 存储
力扣C++|一题多解之数学题专场(1)
力扣C++|一题多解之数学题专场(1)
162 0
力扣C++|一题多解之数学题专场(1)
|
Java Go C++
Golang每日一练(leetDay0118) 扁平化嵌套列表迭代器、整数拆分
Golang每日一练(leetDay0118) 扁平化嵌套列表迭代器、整数拆分
167 0
Golang每日一练(leetDay0118) 扁平化嵌套列表迭代器、整数拆分
|
Java Go C++
Golang每日一练(leetDay0114) 矩阵中的最长递增路径、按要求补齐数组
Golang每日一练(leetDay0114) 矩阵中的最长递增路径、按要求补齐数组
194 0
Golang每日一练(leetDay0114) 矩阵中的最长递增路径、按要求补齐数组
|
Java Go C++
Golang每日一练(leetDay0110) 零钱兑换I\II Coin Change
Golang每日一练(leetDay0110) 零钱兑换I\II Coin Change
174 0
Golang每日一练(leetDay0110) 零钱兑换I\II Coin Change
|
Java Go Rust
Rust每日一练(Leetday0030) 合并有序数组、格雷编码、子集II
Rust每日一练(Leetday0030) 合并有序数组、格雷编码、子集II
163 0
Rust每日一练(Leetday0030) 合并有序数组、格雷编码、子集II

推荐镜像

更多