博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

LeetCode 答案(python)1-17

Posted on 2018-05-02 17:47  呼兰河畔  阅读(4551)  评论(0编辑  收藏  举报

1.给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。

你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。

示例:

给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
class Solution:
     def twoSum(self, nums, target):
        """
         :type nums: List[int]
         :type target: int
        :rtype: List[int]
        """
         for i in nums:
             for j in range(nums.index(i) + 1, len(nums)):
                if i + nums[j] == target:
                     return (nums.index(i),j)

 2.给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。

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

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
#
#
# class Solution:
#     # @return a ListNode
#     def addTwoNumbers(self, l1, l2):
#         if l1 is None:
#             return l2
#         elif l2 is None:
#             return l1
#         else:
#             carry = 0
#             ret = ListNode(0)
#             ret_Last = ret
#
#             while (l1 or l2):
#                 sum = 0
#                 if (l1):
#                     sum = l1.val
#                     l1 = l1.next
#                 if (l2):
#                     sum += l2.val
#                     l2 = l2.next
#                 sum += carry
#                 ret_Last.next = ListNode(sum % 10)
#                 ret_Last = ret_Last.next
#                 carry = (sum >= 10)
#             if (carry):
#                 ret_Last.next = ListNode(1)
#             ret_Last = ret.next
#             del ret
#             return ret_Last

 

3.给定一个字符串,找出不含有重复字符的最长子串的长度。

示例:

给定 "abcabcbb" ,没有重复字符的最长子串是 "abc" ,那么长度就是3。

给定 "bbbbb" ,最长的子串就是 "b" ,长度是1。

给定 "pwwkew" ,最长子串是 "wke" ,长度是3。请注意答案必须是一个子串,"pwke" 是 子序列  而不是子串。

 

# class Solution:
#     def lengthOfLongestSubstring(self, s):
#         """
#         :type s: str
#         :rtype: int
#         """
#         Num = 0
#         for j in range(0, len(s)):
#             ns = ''
#             for i in s[j:]:
#                 if i not in ns:
#                     ns = ns + i
#                     num = len(ns)
#                 else:
#                     break
#
#             if num > Num:
#                 Num = num
#
#         return Num

 

4.给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 。

请找出这两个有序数组的中位数。要求算法的时间复杂度为 O(log (m+n)) 。

示例 1:

nums1 = [1, 3]
nums2 = [2]

中位数是 2.0

示例 2:

nums1 = [1, 2]
nums2 = [3, 4]

中位数是 (2 + 3)/2 = 2.5
# class Solution:
#     def findMedianSortedArrays(self, nums1, nums2):
#         """
#         :type nums1: List[int]
#         :type nums2: List[int]
#         :rtype: float
#         """
#         length1 = len(nums1)
#         length2 = len(nums2)
#         total = length1 + length2
#         print(total)
#
#         alist = []
#         while len(nums1) and len(nums2):
#             if nums1[0] < nums2[0]:
#                 alist.append(nums1.pop(0))
#             else:
#                 alist.append(nums2.pop(0))
#         if nums1:
#             alist += nums1
#         else:
#             alist += nums2
#         print(alist)
#         if total % 2 == 0:
#             half = int(total / 2)
#             return (alist[half] + alist[half-1])/2
#         else:
#             half = int(total // 2)
#             return  alist[half]

 

5.给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为1000。

示例 1:

输入: "babad"
输出: "bab"
注意: "aba"也是一个有效答案。

示例 2:

输入: "cbbd"
输出: "bb"

 

class Solution:
    def longestPalindrome(self, s):
        """
        :type s: str
        :rtype: str
        """
        s='#'+'#'.join(s)+'#'
        ff = 0
        RL=[0]*len(s)
        MaxRight=0
        pos=0
        MaxLen=0
        for i in range(len(s)):
            if i<MaxRight:
                RL[i]=min(RL[2*pos-i], MaxRight-i)
            else:
                RL[i]=1
            #尝试扩展,注意处理边界
            while i-RL[i]>=0 and i+RL[i]<len(s) and s[i-RL[i]]==s[i+RL[i]]:
                RL[i]+=1
            #更新MaxRight,pos
            if RL[i]+i-1>MaxRight:
                MaxRight=RL[i]+i-1
                pos=i
            #更新最长回文串的长度
            # MaxLen=max(MaxLen, RL[i])
            ss = s[i - RL[i] + 1:i + RL[i]]
            ff = max(len(ss), ff)
            if len(ss) >= ff:
                a = ss
        
        a = a.replace('#','')
        return a

 

6. 将字符串 "PAYPALISHIRING" 以Z字形排列成给定的行数:

P   A   H   N
A P L S I I G
Y   I   R

之后从左往右,逐行读取字符:"PAHNAPLSIIGYIR"

实现一个将字符串进行指定行数变换的函数:

string convert(string s, int numRows);

示例 1:

输入: s = "PAYPALISHIRING", numRows = 3
输出: "PAHNAPLSIIGYIR"

示例 2:

输入: s = "PAYPALISHIRING", numRows = 4
输出: "PINALSIGYAHRPI"
解释:

P     I    N
A   L S  I G
Y A   H R
P     I

class Solution:
    def convert(self, s, numRows):
        """
        :type s: str
        :type numRows: int
        :rtype: str
        """
        if numRows == 1:
            return s
        ff = []
        j = -1
        s = list(s)
        for i in range(numRows):
            ff.append([])

        while s!=[]:
            while j < numRows-1 and s!=[]:
                j += 1
                ff[j].append(s.pop(0))

            while j > 0 and s!=[]:
                j -= 1
                ff[j].append(s.pop(0))
        
        s = ''
        for i in range(numRows):
            s = s + ''.join(ff[i])
        return s

 7.给定一个 32 位有符号整数,将整数中的数字进行反转。

示例 1:

输入: 123
输出: 321

 示例 2:

输入: -123
输出: -321

示例 3:

输入: 120
输出: 21

注意:

假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231,  231 − 1]。根据这个假设,如果反转后的整数溢出,则返回 0。

 

class Solution:
    def reverse(self, x):
        """
        :type x: int
        :rtype: int
        """
        if x < -pow(2,31) or x > pow(2,31)-1:
            return 0
        s = str(x)
        if len(s) == 1:
            return x
        s = s[::-1]
        if s.startswith('0'):
            s = s.lstrip('0')
        if s.endswith('-'):
            s = '-' + s.rstrip('-')
        i = int(s)
        if i < -pow(2,31) or i > pow(2,31)-1:
            return 0
        return i

 

9.判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

示例 1:

输入: 121
输出: true

示例 2:

输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。

示例 3:

输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。

class Solution:
    def isPalindrome(self, x):
        """
        :type x: int
        :rtype: bool
        """
        s = list(str(x))

        s1 =list(str(x))
        s1.reverse()

        if  s1 == s:
            return True
        else:
            return False

 

10.给定一个字符串 (s) 和一个字符模式 (p)。实现支持 '.' 和 '*' 的正则表达式匹配。

'.' 匹配任意单个字符。
'*' 匹配零个或多个前面的元素。

匹配应该覆盖整个字符串 (s) ,而不是部分字符串。

说明:

  • s 可能为空,且只包含从 a-z 的小写字母。
  • p 可能为空,且只包含从 a-z 的小写字母,以及字符 . 和 *

示例 1:

输入:
s = "aa"
p = "a"
输出: false
解释: "a" 无法匹配 "aa" 整个字符串。

示例 2:

输入:
s = "aa"
p = "a*"
输出: true
解释: '*' 代表可匹配零个或多个前面的元素, 即可以匹配 'a' 。因此, 重复 'a' 一次, 字符串可变为 "aa"。

示例 3:

输入:
s = "ab"
p = ".*"
输出: true
解释: ".*" 表示可匹配零个或多个('*')任意字符('.')。

示例 4:

输入:
s = "aab"
p = "c*a*b"
输出: true
解释: 'c' 可以不被重复, 'a' 可以被重复一次。因此可以匹配字符串 "aab"。

示例 5:

输入:
s = "mississippi"
p = "mis*is*p*."
输出: false

 

class Solution:
    def isMatch(self, s, p):
        """
        :type s: str
        :type p: str
        :rtype: bool
        """
        sLen = len(s)  
        pLen = len(p)  
        if (pLen == 0):  
            return sLen == 0  
        if (pLen == 1):  
            if (p == s) or ((p == '.') and (len(s) == 1)):  
                return True  
            else:  
                return False  
        #p的最后一个字符不是'*'也不是'.'且不出现在s里,p跟s肯定不匹配  
        if (p[-1] != '*') and (p[-1] != '.') and (p[-1] not in s):  
            return False  
        if (p[1] != '*'):  
            if (len(s) > 0) and ((p[0]==s[0]) or (p[0]=='.')):  
                return self.isMatch(s[1:],p[1:])  
            return False  
        else:  
            while (len(s) > 0) and ((p[0]==s[0]) or (p[0]=='.')):  
                if (self.isMatch(s,p[2:])):  
                    return True  
                s = s[1:]  
            return self.isMatch(s,p[2:])  

 

11.给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (iai) 。画 n 条垂直线,使得垂直线 i 的两个端点分别为 (iai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

注意:你不能倾斜容器,n 至少是2。

class Solution:
    def maxArea(self, height):
        """
        :type height: List[int]
        :rtype: int
        """
        head = 0
        tail = len(height) - 1
        max_water = 0
        while head < tail:
            max_water = max(max_water, min(height[head], height[tail]) * (tail - head))
            if height[head] < height[tail]:
                head += 1
            else:
                tail -= 1
        return max_water
       

 

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

如果不存在公共前缀,返回空字符串 ""

示例 1:

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

示例 2:

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

说明:

所有输入只包含小写字母 a-z 。

class Solution:
    def longestCommonPrefix(self, strs):
        """
        :type strs: List[str]
        :rtype: str
        """     
        if len(strs)==0:
            return ""  
        str=strs[0]  
        Min=len(str)  
        for i in range(1,len(strs)):  
            j=0
            p=strs[i]  
            while j<Min and j<len(p) and p[j]==str[j]:
                j+=1  
            Min = Min if Min<j else j  
        return str[:Min]                  

 

15.给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。

注意:答案中不可以包含重复的三元组。

例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],

满足要求的三元组集合为:
[
  [-1, 0, 1],
  [-1, -1, 2]
]

# class Solution:
#     def threeSum(self, nums):
#         """
#         :type nums: List[int]
#         :rtype: List[List[int]]
#         """
#         diction = {}
#         for num in nums:
#             if num in diction:
#                 diction[num] += 1
#             else:
#                 diction[num] = 1
#
#         dictkey = diction.keys()
#         pos, neg = [], []
#         for p in dictkey:
#             if p >= 0:
#                 pos.append(p)
#             else:
#                 neg.append(p)
#
#         sorted(pos)
#         sorted(neg)
#
#         rsts = []
#         rst = []
#         if 0 in dictkey and diction[0] > 2:
#             rsts.append([0, 0, 0])
#         pos.reverse()
#         for p in pos:
#             for n in neg:
#                 inverse = -(p + n)
#                 if inverse in dictkey:
#                     if (inverse == p or inverse == n) and diction[inverse] > 1:
#                         rst = [inverse, p, n]
#                         rsts.append(sorted(rst))
#                     if inverse > p or inverse < n:
#                         rst = [inverse, p, n]
#                         rsts.append(sorted(rst))
#
#         return rsts

 

16.给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。

例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.

与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).
class Solution:
    def threeSumClosest(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: int
        """
        if len(nums) <= 3:
            return sum(nums)

        nums.sort()
        maxSum = sum(nums[-3:])
        minSum = sum(nums[:3])

        if target <= minSum:
            return minSum
        if target >= maxSum:
            return maxSum

        if target - minSum > maxSum - target:
            closet = maxSum
            distance = maxSum - target
        else:
            closet = minSum
            distance = target - minSum

        for i in range(len(nums) - 2):
            left = i + 1
            right = len(nums) - 1

            while left < right:

                s = nums[i] + nums[left] + nums[right]

                if abs(s - target) < distance:
                    closet = s
                    distance = abs(s - target)

                if s > target:
                    if nums[i] + 2 * nums[left] > target:
                        break

                    right -= 1

                else:
                    if nums[i] + 2 * nums[right] < target:
                        break

                    left += 1

        return closet

17.给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

示例:

输入:"23"
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].

class Solution:
    def __init__(self):
        self.dt = {'1':'',
                 '2':'abc',
                 '3':'def',
                 '4':'ghi',
                 '5':'jkl',
                 '6':'mno',
                 '7':'pqrs',
                 '8':'tuv',
                 '9':'wxyz',
                 '0':''}
        
    def letterCombinations(self, digits):
        """
        :type digits: str
        :rtype: List[str]
        """
        if len(digits) == 0: return []
        elif len(digits) == 1: return [s for s in self.dt[digits[0]]]
        
        elif len(digits) == 2:
            return [a+b for a in self.dt[digits[0]] for b in self.dt[digits[1]]]
        
        else:
            str_list = self.letterCombinations(digits[1:])
            return [a+b for a in self.dt[digits[0]] for b in str_list]