Python每日一练(20230405) 整数转罗马数字、位1的个数、二叉搜索树迭代器

简介: Python每日一练(20230405) 整数转罗马数字、位1的个数、二叉搜索树迭代器

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 的中序遍历中至少存在一个下一个数字。

示例:

输入

["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^5hasNextnext 操作

进阶:

  • 你可以设计一个满足下述条件的解决方案吗?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]


🌟 每日一练刷题专栏 🌟

持续,努力奋斗做强刷题搬运工!

👍 点赞,你的认可是我坚持的动力!

🌟 收藏,你的青睐是我努力的方向!

评论,你的意见是我进步的财富!  

主页:https://hannyang.blog.csdn.net/


目录
相关文章
|
3月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
115 2
|
21天前
|
存储 程序员 数据处理
深入理解Python中的生成器与迭代器###
本文将探讨Python中生成器与迭代器的核心概念,通过对比分析二者的异同,结合具体代码示例,揭示它们在提高程序效率、优化内存使用方面的独特优势。生成器作为迭代器的一种特殊形式,其惰性求值的特性使其在处理大数据流时表现尤为出色。掌握生成器与迭代器的灵活运用,对于提升Python编程技能及解决复杂问题具有重要意义。 ###
|
1月前
|
存储 索引 Python
Python 迭代器是怎么实现的?
Python 迭代器是怎么实现的?
31 6
|
2月前
|
索引 Python
解密 Python 迭代器的实现原理
解密 Python 迭代器的实现原理
48 13
|
2月前
|
存储 Go C语言
Python 的整数是怎么实现的?这篇文章告诉你答案
Python 的整数是怎么实现的?这篇文章告诉你答案
61 7
|
2月前
|
机器学习/深度学习 设计模式 大数据
30天拿下Python之迭代器和生成器
30天拿下Python之迭代器和生成器
20 3
|
1月前
|
存储 大数据 Python
Python 中迭代器与生成器:深度解析与实用指南
Python 中迭代器与生成器:深度解析与实用指南
18 0
|
3月前
|
Python
【Leetcode刷题Python】450. 删除二叉搜索树中的节点
LeetCode上538号问题"把二叉搜索树转换为累加树"的Python实现,使用反向中序遍历并记录节点值之和来更新每个节点的新值。
39 4
【Leetcode刷题Python】450. 删除二叉搜索树中的节点
|
3月前
|
Python
【Leetcode刷题Python】96. 不同的二叉搜索树
LeetCode 96题 "不同的二叉搜索树" 的Python解决方案,使用动态规划算法计算由1至n互不相同节点值组成的二叉搜索树的种数。
26 3
【Leetcode刷题Python】96. 不同的二叉搜索树
|
3月前
|
算法 Serverless Python
使用 Python 查找整数中的数字长度
【8月更文挑战第27天】
62 5
下一篇
无影云桌面