Python学习——LeetCode刷题(三)

66、加一

给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。

最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。

你可以假设除了整数 0 之外,这个整数不会以零开头。

示例 1:

输入:digits = [1,2,3]
输出:[1,2,4]
解释:输入数组表示数字 123。

示例 2:

输入:digits = [4,3,2,1]
输出:[4,3,2,2]
解释:输入数组表示数字 4321。

示例 3:

输入:digits = [9]
输出:[1,0]
解释:输入数组表示数字 9。
加 1 得到了 9 + 1 = 10。
因此,结果应该是 [1,0]。
class Solution(object):
    def plusOne(self, digits):
        """
        :type digits: List[int]
        :rtype: List[int]
        """
        list0=''
        for i in digits:
            list0+=str(i)
        list0=str(int(list0)+1)
        result=[]
        for i in list0:
            result.append(int(i))
        return result

1822、数组元素积的符号

已知函数 signFunc(x) 将会根据 x 的正负返回特定值:

  • 如果 x 是正数,返回 1 。
  • 如果 x 是负数,返回 -1 。
  • 如果 x 是等于 0 ,返回 0 。

给你一个整数数组 nums 。令 product 为数组 nums 中所有元素值的乘积。

返回 signFunc(product) 。

示例 1:

输入:nums = [-1,-2,-3,-4,3,2,1]
输出:1
解释:数组中所有值的乘积是 144 ,且 signFunc(144) = 1

示例 2:

输入:nums = [1,5,0,2,-3]
输出:0
解释:数组中所有值的乘积是 0 ,且 signFunc(0) = 0

示例 3:

输入:nums = [-1,1,-1,1,-1]
输出:-1
解释:数组中所有值的乘积是 -1 ,且 signFunc(-1) = -1
class Solution(object):
    def arraySign(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        flag=1
        for i in nums:
            if i==0:
                return 0
            if i<0:
                flag=-flag
        return flag

 1502、判断能否形成等差数列

给你一个数字数组 arr 。

如果一个数列中,任意相邻两项的差总等于同一个常数,那么这个数列就称为 等差数列 。

如果可以重新排列数组形成等差数列,请返回 true ;否则,返回 false 。

示例 1:

输入:arr = [3,5,1]
输出:true
解释:对数组重新排序得到 [1,3,5] 或者 [5,3,1] ,任意相邻两项的差分别为 2 或 -2 ,可以形成等差数列。

示例 2:

输入:arr = [1,2,4]
输出:false
解释:无法通过重新排序得到等差数列。
class Solution(object):
    def canMakeArithmeticProgression(self, arr):
        """
        :type arr: List[int]
        :rtype: bool
        """
        length=len(arr)
        if length<=2:
            return True
        arr.sort()
        dist=arr[1]-arr[0]
        for i in range(2,length):
            dist_new=arr[i]-arr[i-1]
            if dist_new!=dist:
                return False
        return True

 896、单调数列

如果数组是单调递增或单调递减的,那么它是 单调 

如果对于所有 i <= jnums[i] <= nums[j],那么数组 nums 是单调递增的。 如果对于所有 i <= jnums[i] >= nums[j],那么数组 nums 是单调递减的。

当给定的数组 nums 是单调数组时返回 true,否则返回 false

    示例 1:

    输入:nums = [1,2,2,3]
    输出:true
    

    示例 2:

    输入:nums = [6,5,4,4]
    输出:true
    

    示例 3:

    输入:nums = [1,3,2]
    输出:false

     法一:

    class Solution(object):
        def isMonotonic(self, nums):
            """
            :type nums: List[int]
            :rtype: bool
            """
            return True if sorted(nums)==nums or sorted(nums,reverse=True)==nums else False

    法二:

    class Solution(object):
        def isMonotonic(self, nums):
            """
            :type nums: List[int]
            :rtype: bool
            """
            length=len(nums)
            if length<=2:
                return True
            flag=0
            for i in range(1,length):
                if flag==0:   
                    if nums[i]>nums[i-1]:
                        flag=1
                    elif nums[i]<nums[i-1]:
                        flag=-1
                if flag==1:
                    if nums[i]<nums[i-1]:
                        return False
                if flag==-1:
                    if nums[i]>nums[i-1]:
                        return False
            return True

     13、罗马数字转整数

     

    罗马数字包含以下七种字符: I, V, X, LCD 和 M

    字符          数值
    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。

    给定一个罗马数字,将其转换成整数。

     法一:

    class Solution(object):
        def romanToInt(self, s):
            """
            :type s: str
            :rtype: int
            """
            dict_char={'I':1,
                       'V':5,
                       'X':10,
                       'L':50,
                       'C':100,
                       'D':500,
                       'M':1000}
            sum_value=0
            length=len(s)
            right_value=0
            for i in range(length-1,-1,-1):
                if dict_char[s[i]]<right_value:
                    sum_value-=dict_char[s[i]]
                else:
                    sum_value+=dict_char[s[i]]
                    right_value=dict_char[s[i]]
            return sum_value

    法二:

    class Solution(object):
        def romanToInt(self, s):
            """
            :type s: str
            :rtype: int
            """
            dict_char={'I':1,
                       'V':5,
                       'X':10,
                       'L':50,
                       'C':100,
                       'D':500,
                       'M':1000}
            sum_value=0
            length=len(s)
            for i in range(1,length):
                if dict_char[s[i-1]]<dict_char[s[i]]:
                    sum_value-=dict_char[s[i-1]]
                else:
                    sum_value+=dict_char[s[i-1]]
            sum_value+=dict_char[s[length-1]]
            return sum_value

     

    ### LeetCode 策略与技巧 #### 了解平台特性 确保拥有一个 LeetCode 账户,这样能够记录个人进展以及存储编写过的代码。熟悉该网站的各项功能板块,像目库、提交入口还有交流社区等都是不可或缺的一部分[^1]。 #### 设定清晰的学习方向 明确的目的所在——是为了应对即将到来的技术面试做准备呢?还是旨在强化某些特定类型的算法同数据结构方面的知识体系?依据自身的实际状况挑选合适难度级别的习,推荐按照由浅入深的原则循序渐进地开展训练活动。 #### 掌握有效的方法论 采取有计划性的方式非常重要。对于每一种新的概念或者模式,在初次接触之后应当尝试去理解和掌握其背后的原理机制,而不仅仅局限于表面的操作流程。当遇到复杂问时,试着将其分解成若干个小部分来逐一攻克,并积极思考这些子任务之间可能存在的关联性。 #### 积累工具类算法的应用经验 所谓工具类算法是指那些可以在解答其他更为复杂的算法目过程中被反复利用的基础组件。例如,“深度优先遍历”、“广度优先遍历”,或者是经典的动态规划模型如“01背包”。熟练运用这类通用型的方法有助于简化求解过程并提高效率[^2]。 #### 学会灵活使用双指针技术 双指针是一种高效处理线性序列(如数组或字符串)的有效手段。它可以根据具体应用场景的不同分为两种形式:“快慢指针”适用于检测循环链表等问;“左右指针”则更多用于实现诸如二分查找之类的操作。通过实践不断加深对这两种变体的理解程度及其适用范围的认识是非常必要的[^3]。 ```python def hasCycle(head): slow, fast = head, head while fast and fast.next: slow = slow.next # 慢指针每次移动一步 fast = fast.next.next # 快指针每次跳跃两步 if slow == fast: # 如果两者相遇,则存在环路 return True return False # 否则不存在环路 ```
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值