Python每日一练(20230405)

简介: Python每日一练(20230405)

1. 整数转罗马数字


罗马数字包含以下七种字符: 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:

输入: num = 3

输出: "III"


示例 2:

输入: num = 4

输出: "IV"


示例 3:

输入: num = 9

输出: "IX"


示例 4:

输入: num = 58

输出: "LVIII"

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


示例 5:

输入: num = 1994

输出: "MCMXCIV"

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


提示:

   1 <= num <= 3999

出处:


代码:

from math import floor
class Solution:
    def intToRoman(self, num: int) -> str:
        f = 1000
        f2 = 1000
        sym = ['M', 'D', 'C', 'L', 'X', 'V', 'I']
        fsi = 0
        s = [2, 5]
        si = 0
        s2 = [10, 1]
        si2 = 0
        roman = []
        while num > 0:
            d = floor(num/f)
            r = num % f
            d2 = floor(num/f2)
            r2 = num % f2
            if d > 0:
                if d == 4:
                    roman.append(sym[fsi])
                    roman.append(sym[fsi-1])
                    num = r
                elif d2 == 9:
                    roman.append(sym[fsi+1])
                    roman.append(sym[fsi-1])
                    num = r2
                else:
                    i = 0
                    while i < d:
                        roman.append(sym[fsi])
                        i += 1
                    num = r
            f = f/s[si]
            si += 1
            si %= 2
            f2 = f2/s2[si2]
            si2 += 1
            si2 %= 2
            fsi += 1
        return ''.join(roman)
# %%
s = Solution()
print(s.intToRoman(num = 3))
print(s.intToRoman(num = 4))
print(s.intToRoman(num = 9))
print(s.intToRoman(num = 58))
print(s.intToRoman(num = 1994))

输出:

III

IV

IX

LVIII

MCMXCIV


2. 位1的个数


编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 '1' 的个数(也被称为汉明重量)。


提示:

   请注意,在某些语言(如 Java)中,没有无符号整数类型。在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因为无论整数是有符号的还是无符号的,其内部的二进制表示形式都是相同的。


   在 Java 中,编译器使用二进制补码(https://baike.baidu.com/item/二进制补码/5295284)记法来表示有符号整数。因此,在上面的 示例 3 中,输入表示有符号整数 -3。


示例 1:

输入:00000000000000000000000000001011

输出:3

解释:输入的二进制串  

00000000000000000000000000001011 中,共有三位为 '1'。

示例 2:

输入:00000000000000000000000010000000

输出:1

解释:输入的二进制串 00000000000000000000000010000000 中,共有一位为 '1'。


示例 3:

输入:11111111111111111111111111111101

输出:31

解释:输入的二进制串 11111111111111111111111111111101 中,共有 31 位为 '1'。


提示:

   输入必须是长度为 32 的 二进制串 。

进阶:

   如果多次调用这个函数,你将如何优化你的算法?

出处:

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

代码:

class Solution(object):
    def majorityElement(self, nums):
        count = 0
        num = int(n, 2)
        mask = 1
        for i in range(32):
            if num & mask:
                count += 1
            mask <<= 1
        return count
# %%
s = Solution()
n = "00000000000000000000000000001011"
print(s.majorityElement(n))
n = "00000000000000000000000010000000"
print(s.majorityElement(n))
n = "11111111111111111111111111111101"
print(s.majorityElement(n))

输出:

3

1

31


3. 二叉搜索树迭代器


实现一个二叉搜索树迭代器类BSTIterator ,表示一个按中序遍历二叉搜索树(BST)的迭代器:


   BSTIterator(TreeNode root) 初始化 BSTIterator 类的一个对象。BST 的根节点 root 会作为构造函数的一部分给出。指针应初始化为一个不存在于 BST 中的数字,且该数字小于 BST 中的任何元素。


   boolean hasNext() 如果向指针右侧遍历存在数字,则返回 true ;否则返回 false 。


   int next()将指针向右移动,然后返回指针处的数字。


注意,指针初始化为一个不存在于 BST 中的数字,所以对 next() 的首次调用将返回 BST 中的最小元素。


你可以假设 next() 调用总是有效的,也就是说,当调用 next() 时,BST 的中序遍历中至少存在一个下一个数字。


示例:

743f55b78d358ff4ba5fbb7d8088a0d9.png


输入
["BSTIterator", "next", "next", "hasNext", "next", "hasNext", "next", "hasNext", "next", "hasNext"]
[[[7, 3, 15, null, null, 9, 20]], [], [], [], [], [], [], [], [], []]
输出
[null, 3, 7, true, 9, true, 15, true, 20, false]
解释 
BSTIterator bSTIterator = new BSTIterator([7, 3, 15, null, null, 9, 20]); 
bSTIterator.next(); // 返回 3 
bSTIterator.next(); // 返回 7 
bSTIterator.hasNext(); // 返回 True 
bSTIterator.next(); // 返回 9 
bSTIterator.hasNext(); // 返回 True 
bSTIterator.next(); // 返回 15 
bSTIterator.hasNext(); // 返回 True 
bSTIterator.next(); // 返回 20 
bSTIterator.hasNext(); // 返回 False



提示:

   树中节点的数目在范围 [1, 10^5] 内

   0 <= Node.val <= 10^6

   最多调用 10^5 次 hasNext 和 next 操作


进阶:

   你可以设计一个满足下述条件的解决方案吗?next() 和 hasNext() 操作均摊时间复杂度为 O(1) ,并使用 O(h) 内存。其中 h 是树的高度。


出处:

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


代码:


class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None
class BSTIterator:
    def __init__(self, root: TreeNode):
        self.index = -1
        self.node_list = []
        self._iterator(root)
    def _iterator(self, root):
        if not root:
            return
        self._iterator(root.left)
        self.node_list.append(root.val)
        self._iterator(root.right)
    def next(self) -> int:
        """
        @return the next smallest number
        """
        self.index += 1
        return self.node_list[self.index]
    def hasNext(self) -> bool:
        """
        @return whether we have a next smallest number
        """
        return self.index + 1 < len(self.node_list)
# Your BSTIterator object will be instantiated and called as such:
# obj = BSTIterator(root)
# param_1 = obj.next()
# param_2 = obj.hasNext()
def listToTree(lst: list) -> TreeNode:
    if not lst:
        return None
    root = TreeNode(lst[0])
    queue = [root]
    i = 1
    while i < len(lst):
        node = queue.pop(0)
        if lst[i] is not None:
            node.left = TreeNode(lst[i])
            queue.append(node.left)
        i += 1
        if i < len(lst) and lst[i] is not None:
            node.right = TreeNode(lst[i])
            queue.append(node.right)
        i += 1
    return root
if __name__ == "__main__":
    null = None
    nums = [7,3,15,null,null,9,20]
    root = listToTree(nums)
    res = []
    bSTIterator = BSTIterator(root)
    res.append(bSTIterator.next()) # 返回 3 
    res.append(bSTIterator.next()) # 返回 7 
    res.append(bSTIterator.hasNext()) # 返回 True 
    res.append(bSTIterator.next()) # 返回 9 
    res.append(bSTIterator.hasNext()) # 返回 True 
    res.append(bSTIterator.next()) # 返回 15 
    res.append(bSTIterator.hasNext()) # 返回 True 
    res.append(bSTIterator.next()) # 返回 20 
    res.append(bSTIterator.hasNext()) # 返回 False
    print(res)



输出:

[3, 7, True, 9, True, 15, True, 20, False]



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