菜鸟的LeetCode之旅(易篇)

能看这篇文章的朋友,确定是对算法(找工做涨工资)感兴趣的。python

1.两数之和

LeetCode题源git

GitHub示例github

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
""" @File : 0001_两数之和_易.py @Time : 2019/10/18 14:55 @Author : Crisimple @Github : https://crisimple.github.io/ @Contact : Crisimple@foxmail.com @License : (C)Copyright 2017-2019, Micro-Circle @Desc : """
""" ------------------------------------------------------------------------------------------ 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你能够假设每种输入只会对应一个答案。可是,你不能重复利用这个数组中一样的元素。 示例: 给定 nums = [2, 7, 11, 15], target = 9 由于 nums[0] + nums[1] = 2 + 7 = 9,因此返回 [0, 1] 来源:力扣(LeetCode) 连接:https://leetcode-cn.com/problems/two-sum 著做权归领扣网络全部。商业转载请联系官方受权,非商业转载请注明出处。 ------------------------------------------------------------------------------------------- """

from typing import List


""" 思路一: (1)从数组nums中列举元素, 并定义一个空字典; (2)用目标值target去减列举的元素, 若是它们的差在字典中,则返回它们的下标; (3)若是它们的差不在字典中, 则把该值赋值给空字典, 直到找到符合的值, 不然返回None。 时间复杂度: O(n) """
class Solution1:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        """ :param nums: 整数数组: nums: List[int] :param target: 目标值: target: int :return: 返回值: List[int] """
        hashmap = {}
        for index, num in enumerate(nums):
            another_num = target - num
            if another_num in hashmap:
                return [hashmap[another_num], index]
            hashmap[num] = index
        return None


if __name__ == "__main__":
    nums1 = [1, 2, 3, 4, 5, 6]
    target1 = 9
    s1 = Solution1()
    print(s1.twoSum(nums=nums1, target=target1))
复制代码

7.两数之和

LeetCode题源算法

GitHub示例数组

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
""" @File : 0007_整数反转_易.py @Time : 2019/10/29 10:20 @Author : Crisimple @Github : https://crisimple.github.io/ @Contact : Crisimple@foxmail.com @License : (C)Copyright 2017-2019, Micro-Circle @Desc : None """
""" 给出一个 32 位的有符号整数,你须要将这个整数中每位上的数字进行反转。 示例 1: 输入: 123 输出: 321 示例 2: 输入: -123 输出: -321 示例 3: 输入: 120 输出: 21 注意: 假设咱们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231,  231 − 1]。请根据这个假设,若是反转后整数溢出那么就返回 0。 来源:力扣(LeetCode) 连接:https://leetcode-cn.com/problems/reverse-integer 著做权归领扣网络全部。商业转载请联系官方受权,非商业转载请注明出处。 """

""" 思路一: (1)将整数取余操做并存入列表进行反转; (2)将反转后的列表进行累加输出; (3)区分大于0和小于0的状况 (4)考虑数字范围及反转后溢出的问题 时间复杂度: O(n**2) """
class Solution1:
    def reverse(self, x: int) -> int:
        """ @param x: 要被反转的整数 @return: 返回的反转后的整数 """
        arr = []
        a = 0
        if x > 0:
            for i in range(len(str(x))):
                arr.insert(i, (x // 10**i % 10))

            rra = list(reversed(arr))
            k = 1
            for j in range(len(rra)):
                a = rra[j]*(10**j) + a
                k = k + 1
            if -2**31 < a < 2**31-1:
                return a
            else:
                return 0
        elif x < 0:
            x = -x
            for i in range(len(str(x))):
                arr.insert(i, (x // 10**i % 10))

            rra = list(reversed(arr))
            k = 1
            for j in range(len(rra)):
                a = rra[j]*(10**j) + a
                k = k + 1
            if -2**31 < a < 2**31-1:
                return -a
            else:
                return 0
        else:
            return 0


""" 思路二:(1)将整数转换为字符串, 将字符串进行反转操做; (2)将反转后的字符串转换为整数; (3)转换后的整数考虑大于0小于0及0的状况; (4)考虑数字范围及反转后溢出的问题 时间复杂度: O(n) """
class Solution2:
    def reverse(self, x: int) -> int:
        pass

if __name__ == "__main__":
    """ 测试用例一 """
    x1 = -4567
    s1 = Solution1()
    print(s1.reverse(x=x1))

    """ 测试用例二 """
    
复制代码

9.回文数

LeetCode题源网络

GitHub示例函数

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
""" @File : 0009_回文数_易.py @Time : 2019/10/30 11:47 @Author : Crisimple @Github : https://crisimple.github.io/ @Contact : Crisimple@foxmail.com @License : (C)Copyright 2017-2019, Micro-Circle @Desc : None """
""" 判断一个整数是不是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是同样的整数。 示例 1: 输入: 121 输出: true 示例 2: 输入: -121 输出: false 解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。所以它不是一个回文数。 示例 3: 输入: 10 输出: false 解释: 从右向左读, 为 01 。所以它不是一个回文数。 进阶: 你能不将整数转为字符串来解决这个问题吗? 来源:力扣(LeetCode) 连接:https://leetcode-cn.com/problems/palindrome-number 著做权归领扣网络全部。商业转载请联系官方受权,非商业转载请注明出处。 """

""" 思路一: 1.将整数转化为字符串; 2.若是是回文数的话,正反字符串是同样的,返回True;若是不是的话,字符串确定不同,返回False """
class Solution1:
    def isPalindrome(self, x: int) -> bool:
        if str(x) == str(x)[::-1]:
            return True
        else:
            return False


""" 思路二: 1.将整数反向处理; 2.比较原数和处理过的数据,若是相等则是,不然不是 """
class Solution2:
    def isPalindrome(self, x: int) -> bool:
        if x < 0:
            return False

        m, n = x, 0
        while m:
            """ " / " 表示浮点数除法,返回浮点结果; " // " 表示整数除法,返回不大于结果的一个最大的整数 " % " 表示除法的余数,又叫取模运算 """
            n = n * 10 + m % 10
            m = m // 10

        if x == n:
            return True
        else:
            return False


if __name__ == "__main__":
    """ 测试用例一 """
    s1 = Solution1()
    x1 = 12321
    # print(s1.isPalindrome(x=x1))

    """ 测试用例二 """
    s2 = Solution2()
    x2 = -12321
    print(s2.isPalindrome(x=x2))

print(121 % 10)
print(121 // 10)
print(12 // 10)
print(1 // 10)

str1 = "soose"
print(str1[::-1])

复制代码

13. 罗马数字转整数

LeetCode题源测试

GitHub示例spa

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
""" @File : 0013_罗马数字转整数.py @Time : 2019/11/4 10:51 @Author : Crisimple @Github : https://crisimple.github.io/ @Contact : Crisimple@foxmail.com @License : (C)Copyright 2017-2019, Micro-Circle @Desc : None """

""" 罗马数字包含如下七种字符: I, V, X, L,C,D 和 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。 给定一个罗马数字,将其转换成整数。输入确保在 1 到 3999 的范围内。 示例 1: 输入: "III" 输出: 3 示例 2: 输入: "IV" 输出: 4 示例 3: 输入: "IX" 输出: 9 示例 4: 输入: "LVIII" 输出: 58 解释: L = 50, V= 5, III = 3. 示例 5: 输入: "MCMXCIV" 输出: 1994 解释: M = 1000, CM = 900, XC = 90, IV = 4. 来源:力扣(LeetCode) 连接:https://leetcode-cn.com/problems/roman-to-integer 著做权归领扣网络全部。商业转载请联系官方受权,非商业转载请注明出处。 """


""" 思路一: 1.规律是罗马数字转换成整数时,若是前一个数大于等于后一个数,只须要加上前一个罗马数字对应的整数便可; 若是前一个数小于后一个数的时候,减去前一个罗马数对应的整数; 2.直到转换到倒数第一个数,因为最后一个数没有可比较对象了,因此加上最后一个数; 3.将1和2的结果求和,便可获得最终转换完的整数结果 """
class Solution1:
    def romanToInt(self, s: str) -> int:
        """ @param s: 被转换的罗马数字 @return: 转换后返回的 """
        roman_num = {
            'M': 1000,
            'D': 500,
            'C': 100,
            'L': 50,
            'X': 10,
            'V': 5,
            'I': 1
        }
        sum_num = 0
        for i in range(len(s)-1):
            if roman_num[s[i]] >= roman_num[s[i+1]]:
                sum_num += roman_num[s[i]]
            else:
                sum_num -= roman_num[s[i]]
        last_num = s[len(s)-1]
        sum_num = sum_num + roman_num[last_num]
        return sum_num


if __name__ == "__main__":
    rt = Solution1()
    print(rt.romanToInt("XC"))
复制代码

14.最长公共前缀

LeetCode题源code

GitHub示例

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""
@File    :   0014_最长公共前缀,py
@Time    :   2019/11/4 16:34
@Author  :   Crisimple
@Github :    https://crisimple.github.io/
@Contact :   Crisimple@foxmail.com
@License :   (C)Copyright 2017-2019, Micro-Circle
@Desc    :   None
"""
from typing import List

"""
编写一个函数来查找字符串数组中的最长公共前缀。

若是不存在公共前缀,返回空字符串 ""。

示例 1:
输入: ["flower","flow","flight"]
输出: "fl"

示例 2:
输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。

说明:
全部输入只包含小写字母 a-z 。

来源:力扣(LeetCode)
连接:https://leetcode-cn.com/problems/longest-common-prefix
著做权归领扣网络全部。商业转载请联系官方受权,非商业转载请注明出处。
"""

"""
内置函数: zip() 函数用于将可迭代的对象做为参数,将对象中对应的元素打包成一个个元组,而后返回由这些元组组成的列表。
思路一: 1.利用zip() 函数将字符串列表打包成一个个元组;
       2.由于是共同的前缀, 因此用集合set将元组去重;
       3.若是说去重后的结合长度==1, 则说明是字符串共有的元素,则进行字符拼接,若是不是则推出循环
时间复杂度: O(n) 
"""
class Solution1:
    def longestCommonPrefix(self, strs: List[str]) -> str:
        """
        @param strs: 字符串列表
        @return: 公共的字符串前缀
        print(i)
        print(set(i))
        print(len(set(i)))
        """
        s = ""
        for i in zip(*strs):
            # 由于set具备自然的去重性
            if len(set(i)) == 1:
                s += i[0]
            else:
                break
        return s


if __name__ == "__main__":
    s1 = Solution1()
    print(s1.longestCommonPrefix(['flower', 'fly', 'flay']))

复制代码

xx.模板

LeetCode题源

GitHub示例

复制代码
相关文章
相关标签/搜索