leetcode之两数相加+整数翻转

打算着两个问题做个记录吧,毕竟脑子这种东西,还是没有记录下来实在,虽然问题解决之后看着简单,可是做的时候也是比较难的,都是看的题解思路。

1. 两数相加

问题描述:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
这个一开始我是写了两个for循环遍历,很容易想到的一个方法,但是时间很久。

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        for i in range(len(nums)):
            for j in range(i+1, len(nums)):
                if (nums[i] + nums[j]) == target:
                    return i, j
执行用时 :6500 ms, 在所有 python3 提交中击败了5.02% 的用户
内存消耗 :13.6 MB, 在所有 python3 提交中击败了87.98%的用户

参照官方题解,使用哈希表,虽然我没有学过哈希表,但是他的思想大体还是可以理解的,而且在Python中没有哈希的概念,但是有字典,这里的思想就是用target-nums[keys]看看其值所对应的下表。
这里一个细节是,把具体值作为键,把下标作为值.

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        dic = {}
        for index, value in enumerate(nums):
            dic[value] = index
        for index, value in enumerate(dic):
            cache = target-value
            if dic.get(cache) != None and (dic.get(cache) != dic[value]):
                return dic[value], dic[cache]

emm,果然自己写还是写不对,艹,这个我想了半小时,还是没法解决输入是【3,3】的问题。还是太菜了。看大佬idea,果然还是眼高手低~~

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        dic = {}        
        for i, num in enumerate(nums):
            j = target-num
            if dic.get(j) != None and dic.get(j)!=i:
                return i, dic[j]
            dic[num] = i

2. 反转

给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123
输出: 321
 示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231,  231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。

这里参照的一个解题思路是:将输入的有符号数统一转化成正数,因为Python中有个比较坑爹的求余机制。 先来看题解。

class Solution:
    def reverse(self, x: int) -> int:
        input = abs(x)
        # 这里else后面不需要加 :
        range = ((1<<31) -1) if x>0 else 1<<31
        output=0
        # 这里要用while一直循环到为0结束,不能用if.
        while(input != 0):  
            output=output*10 + input%10
            if output > range:
                return 0
            input = input // 10
        return output if x>0 else -output

python的负数求余机制。

在Java中,对于-23%10 取余运算应该输出-3,而在Python中,输出的却是7, 这是因为其整除机制就不一样。
-23//10 整除运算输出的是-2, 而在Python中-23//10输出的却是-3.由此,余值就不一样了。

根据提供的引用内容,Leetcode 2 "两数相加"是一个涉及链表的问题。该问题给定了两个非负整数,每个整数的每一位都是按照逆序的方式存储在链表中。我们需要将这两个链表相加,并返回一个新的链表作为结果。 具体解题思路可以使用迭代法或递归法来解决。迭代法的伪代码如下所示: ``` 初始化一个哑节点 dummy 和一个进位 carry,同时把两个链表的头节点分别赋值给 p 和 q 遍历链表,直到 p 和 q 都为 None 计算当前的和 sum 为 p.val + q.val + carry 计算当前的进位 carry 为 sum // 10 创建一个新节点 node,节点的值为 sum % 10 把新节点连接到结果链表的尾部 更新 p 和 q 分别为 p.next 和 q.next 如果最后还有进位 carry,则创建一个新节点 node,节点的值为 carry,并连接到结果链表的尾部 返回结果链表的头节点 dummy.next ``` 递归法的伪代码如下所示: ``` 定义一个辅助函数 addTwoNumbersHelper,输入为两个链表的头节点 p 和 q,以及进位 carry 如果 p 和 q 都为 None 且 进位 carry 为 0,则返回 None 计算当前的和 sum 为 p.val + q.val + carry 计算当前的进位 carry 为 sum // 10 创建一个新节点 node,节点的值为 sum % 10 设置新节点的下一个节点为递归调用 addTwoNumbersHelper(p.next, q.next, carry) 返回新节点 返回 addTwoNumbersHelper(p, q, 0) 的结果 以上是解决 Leetcode 2 "两数相加"问题的两种方法。如果你还有其他相关问题,请
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值