LeetCode 答案(python)1-17
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,每个数代表坐标中的一个点 (i, ai) 。画 n 条垂直线,使得垂直线 i 的两个端点分别为 (i, ai) 和 (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]
LeetCode 答案(python)1-17的更多相关文章
- LeetCode专题-Python实现之第28题: Implement strStr()
导航页-LeetCode专题-Python实现 相关代码已经上传到github:https://github.com/exploitht/leetcode-python 文中代码为了不动官网提供的初始 ...
- LeetCode专题-Python实现之第27题:Remove Element
导航页-LeetCode专题-Python实现 相关代码已经上传到github:https://github.com/exploitht/leetcode-python 文中代码为了不动官网提供的初始 ...
- LeetCode专题-Python实现之第26题:Remove Duplicates from Sorted Array
导航页-LeetCode专题-Python实现 相关代码已经上传到github:https://github.com/exploitht/leetcode-python 文中代码为了不动官网提供的初始 ...
- LeetCode专题-Python实现之第21题:Merge Two Sorted Lists
导航页-LeetCode专题-Python实现 相关代码已经上传到github:https://github.com/exploitht/leetcode-python 文中代码为了不动官网提供的初始 ...
- LeetCode专题-Python实现之第20题:Valid Parentheses
导航页-LeetCode专题-Python实现 相关代码已经上传到github:https://github.com/exploitht/leetcode-python 文中代码为了不动官网提供的初始 ...
- LeetCode专题-Python实现之第9题:Palindrome Number
导航页-LeetCode专题-Python实现 相关代码已经上传到github:https://github.com/exploitht/leetcode-python 文中代码为了不动官网提供的初始 ...
- LeetCode专题-Python实现之第14题:Longest Common Prefix
导航页-LeetCode专题-Python实现 相关代码已经上传到github:https://github.com/exploitht/leetcode-python 文中代码为了不动官网提供的初始 ...
- LeetCode专题-Python实现之第13题:Roman to Integer
导航页-LeetCode专题-Python实现 相关代码已经上传到github:https://github.com/exploitht/leetcode-python 文中代码为了不动官网提供的初始 ...
- LeetCode专题-Python实现之第7题:Reverse Integer
导航页-LeetCode专题-Python实现 相关代码已经上传到github:https://github.com/exploitht/leetcode-python 文中代码为了不动官网提供的初始 ...
- LeetCode专题-Python实现之第1题:Two Sum
导航页-LeetCode专题-Python实现 相关代码已经上传到github:https://github.com/exploitht/leetcode-python 文中代码为了不动官网提供的初始 ...
随机推荐
- DSSM算法-计算文本相似度
转载请注明出处: http://blog.csdn.net/u013074302/article/details/76422551 导语 在NLP领域,语义相似度的计算一直是个难题:搜索场景下quer ...
- JavaScript作用域与闭包总结
1.全局作用域 所有浏览器都支持 window 对象,它表示浏览器窗口,JavaScript 全局对象.函数以及变量均自动成为 window 对象的成员.所以,全局变量是 window 对象的属性,全 ...
- mysql索引分类
mysql索引分类 一.总结 一句话总结: 主键索引:设定为主键后数据库会自动建立索引,innodb为聚簇索引 单值索引:一个索引只包含单个列,一个表可以有多个单列索引:CREATE INDEX id ...
- [Oracle] 简单建表语句
// 注意表名,字段名,索引名 尽量不要带引号 CREATE TABLE FIRSTTB ( "ID" NUMBER(8,0) not null primary key, & ...
- SQL-W3School-高级:SQL RIGHT JOIN 关键字
ylbtech-SQL-W3School-高级:SQL RIGHT JOIN 关键字 1.返回顶部 1. SQL RIGHT JOIN 关键字 RIGHT JOIN 关键字会右表 (table_nam ...
- SQL-W3School-基础:SQL UPDATE 语句
ylbtech-SQL-W3School-基础:SQL UPDATE 语句 1.返回顶部 1. Update 语句 Update 语句用于修改表中的数据. 语法: UPDATE 表名称 SET 列名称 ...
- Java HttpClient Post请求参数格式为XML
1.最近忙着做一个接口,拿到文档的时候,what?我当时就震惊了,全都是XML数据传输. 我当时就懵了,哎没得办法,在暑假传输这方面笔者比较熟练json格式数据,简单易懂啊 那就学呗. 2.我在使用的 ...
- iptables之精髓(二)
iptables实际操作 使用-v选项后,iptables为我们展示的信息更多了,那么,这些字段都是什么意思呢?我们来总结一下 pkts:对应规则匹配到的报文的个数. bytes:对应匹配到的报文包的 ...
- MATLAB常用快捷键总结
MATLAB 命令栏显示处理的常用命令 清屏:clc 紧凑显示格式:format compact 宽松显示格式:format loose 数据高精度显示:format longG 数据低精度显示:fo ...
- [译] NAT - 网络地址转换(2016)
[译] NAT - 网络地址转换(2016) Published at 2019-02-17 | Last Update 译者序 本文翻译自 2016 年的一篇英文博客 NAT - Network A ...