每日一练——整数反转、括号生成

整数反转:

要求:
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
方法很简单,但是要注意不要忽略负数的输入
法一:python取巧的写法,将整形转换成字符串,利用字符串切片操作轻松实现反向。

    def reverse(self, x: int) -> int:
        str_x = str(abs(x))
        res = int(str_x[::-1])
        if x < 0:
            res = -res
        return res if -(1 << 31) < res < (1 << 31) - 1 else 0

其中涉及位的操作:
在这里插入图片描述
法二
对结果赋值为0,对x进行取余运算,每次除以10,余数加到结果后。当商与余数都为0时,说明x以全部转换完毕。
具体实现如下:

def reverse(self, x: int) -> int:
        flag = 1 if x >= 0 else - 1 # 记录下当前x的符号
        x = abs(x)
        ans = 0
        quotient,remainder = divmod(x,10) #此处的divmod等价于quotient = x //10 ,remainder = x % 10 
        while quotient > 0 or remainder > 0:
            ans = ans * 10 + remainder
            quotient, remainder = divmod(quotient, 10)
        ans *= flag
        return ans if -(1<<31) < ans < (1<<31)-1 else 0

括号生成:

数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
例:
在这里插入图片描述
法1:每次加入整个括号
我们可以在已有括号序列的每个间隔中加入同时带有左括号与右括号的一个完整括号。每个括号序列的间隔数等于其长度加一。
具体实现如下:

def generateParenthesis(self, n: int) -> List[str]:
        if n <= 0:
            return []
        res = set() #用集合存储结果,可去重
        for _ in range(n): # 需要添加n个括号,所以循环n次
            if len(res) == 0:
                res.add("()")
            else:
                tmp = set() #设置一个暂时的集合来存储新生成的括号序列
                for x in res: #遍历res,x为每一个不同的括号序列
                    for i in range(len(x) + 1): #在每一个间隔中加入()并将新生成的序列存入tmp
                        tmp.add(x[:i] + "()" + x[i:])
                res = tmp
        return list(res)

简化后可得以下代码

def generateParenthesis(self, n: int) -> List[str]:
        if n <= 0:
            return []
        res = {"()",}
        for _ in (range(n - 1)):
            res = {x[:i] + "()" + x[i:] for x in res for i in range(len(x) + 1)}
        return list(res)

运行结果:
在这里插入图片描述

法二: 每次加入半个括号,利用dfs的思想
可以模拟每次只加半个括号的过程,第一个必须添加左括号,则得到“(”,下一个可以继续加入左括号,也可以加入右括号。如果下一个加入的是左括号,则得到“((”接下来可以连续加入两个右括号。以此类推可得到规律:
当左括号个数小于n时,可继续添加左括号,当右括号小于左括号数时,可继续添加右括号。
既然利用dfs,则就要考虑递归的basecase,很明显,此题的最终结束条件为递归深度等于2n。
递归的重要特性就是本层只管本层的事。递归的每一层只需要做一件事,:加左括号或者加右括号。
递归时需要输入的参数有:现有的括号序列,左括号数,右括号数,需生成括号数,递归深度。
最终代码如下:

def generate_parentheses(n):
    res = []
    sample = ""
    
    def generate_parentheses_helper(sample, depth, n, left_num, right_num):
    	if depth == 2 * n: # basecase
        	res.append(sample)
        	return
    	if left_num < n:
        	generate_parentheses_helper(sample + "(", depth + 1, n, left_num + 1, right_num)
    	if right_num < left_num:
        	generate_parentheses_helper(sample + ")", depth + 1, n, left_num, right_num + 1)
        	
    if n != 0:
        generate_parentheses_helper(sample, 0, n, 0, 0)
    return res

运行结果:
在这里插入图片描述

很明显,法1简单快捷,时间复杂度低。但法二可以锻炼写递归,写dfs的能力。

Python的计算思维训练中,循环与列表是非常重要的一部分。循环是一种重复执行特定代码块的方式,而列表则是一种存储多个元素的数据结构。 循环可以帮助我们简化代码、减少重复性工作。在Python中,有两种常见的循环结构:for循环和while循环。for循环适用于已知循环次数的情况,而while循环适用于未知循环次数的情况。 列表是一种有序序列,可以用来存储多个元素。在Python中,列表用方括号([])表示,元素之间使用逗号(,)分隔。列表可以包含不同类型的元素,如整数、浮点数、字符串等。 循环与列表的结合应用让问题的解决更加高效。我们可以通过循环遍历列表中的每个元素,执行相同的操作或针对每个元素执行不同的操作。例如,我们可以使用循环来求列表中所有元素的和或平均值。同时,我们还可以在循环中使用条件语句对列表中的元素进行筛选和处理。 除了遍历列表,我们还可以使用循环来生成列表。通过循环的迭代,我们可以根据特定的规律生成一系列元素,并将它们存储到列表中。这在处理大量数据或自动生成一系列数值时非常有用。 总的来说,循环与列表是Python计算思维中非常重要的一部分。它们可以帮助我们解决各种问题,简化代码并提高效率。掌握循环与列表的使用方法,将会为我们的编程开发带来更多的便利和灵活性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值