1.给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。
你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。
示例:
给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1]
1 2 3 4 5 6 7 8 9 10 11 | 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | # 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"
是 子序列 而不是子串。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | # 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | # 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"
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | 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。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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 。因此它不是一个回文数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | 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。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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
。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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] ]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | # 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).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | 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"].
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | 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] |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
· Linux系统下SQL Server数据库镜像配置全流程详解
· Sdcb Chats 技术博客:数据库 ID 选型的曲折之路 - 从 Guid 到自增 ID,再到
· Winform-耗时操作导致界面渲染滞后
· Phi小模型开发教程:C#使用本地模型Phi视觉模型分析图像,实现图片分类、搜索等功能
· 语音处理 开源项目 EchoSharp
· drools 规则引擎和 solon-flow 哪个好?solon-flow 简明教程