58. 最后一个单词的长度【易】
给定一个仅包含大小写字母和空格 ' '
的字符串,返回其最后一个单词的长度。
如果不存在最后一个单词,请返回 0 。
说明:一个单词是指由字母组成,但不包含任何空格的字符串。
示例:
输入:“Hello,world”
输出: 5
class Solution(object):
def lengthOfLastWord(self, s):
"""
:type s: str
:rtype: int
"""
str = " "
count = 0
for w in s[::-1]:
if w == " " and str != " ":
return count
if w != " ":
count = count + 1
str = w + str
return count
亮点:切片
14. 最长公共前缀【易】
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""
。
示例:
输入:['flower', 'flow', 'flight']
输出:'fl'
def longestCommonPrefix(self, strs):
"""
:type strs: List[str]
:rtype: str
"""
if not strs:
return ""
maxlen = len(strs[0])
max_str = strs[0]
for str in strs:
if maxlen > len(str):
maxlen = len(str)
max_str = str
for i in range(maxlen):
for str in strs:
if str[i] != max_str[i]:
return str[:i]
return max_str
以下为简洁代码:
def longestCommonPrefix(self, strs):
res = ""
if len(strs) == 0:
return ""
for each in zip(*strs):#zip()函数用于将可迭代对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表
if len(set(each)) == 1:#利用集合创建一个无序不重复元素集
res += each[0]
else:
return res
return res
知识点: zip()函数的特性!
66. 加一【易】
给定一个非负整数组成的非空数组,在该数的基础上加一,返回一个新的数组。
最高位数字存放在数组的首位, 数组中每个元素只存储一个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。
示例 1:
输入:[1,2,3]
输出:[1,2,4]
def plusOne(self, digits):
"""
:type digits: List[int]
:rtype: List[int]
"""
result = 0
for digit in digits:
if result != 0:
result = result * 10 + digit
else:
result = digit
result = result + 1
strNum = str(result)
res = []
for i in range(len(strNum)):
res.append(int(strNum[i]))
return res
知识点:str(),append()函数
4. 两个排序数组的中位数【难】
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 。
请找出这两个有序数组的中位数。要求算法的时间复杂度为 O(log (m+n)) 。
示例 1:
nums1 = [1,3]
nums2 = [2]
输出:2.0
def findMedianSortedArrays(self, nums1, nums2):
"""
:type nums1: List[int]
:type nums2: List[int]
:rtype: float
"""
len1 = len(nums1)
len2 = len(nums2)
length = len1 + len2
half = length >> 1
if length & 1:
return float(self.Kth(nums1,len1,nums2,len2,half + 1))
else:
return float(self.Kth(nums1,len1,nums2,len2,half)+self.Kth(nums1,len1,nums2,len2,half+1))/2
def Kth(self, a, lena, b, lenb, k):
if lena > lenb:
return self.Kth(b,lenb,a,lena,k)
if lena == 0:
return b[k-1]
if k == 1:
return min(a[0], b[0])
pa = min(k >> 1, lena)
pb = k - pa
if a[pa-1] < b[pb-1]:
return self.Kth(a[pa:], lena - pa,b, lenb, k-pa)
elif a[pa-1] > b[pb-1]:
return self.Kth(a,lena,b[pb:],lenb - pb, k - pb)
else:
return a[pa-1]
知识点:
借鉴网上博客的解题思路如下
1.将问题转换为寻找第k大数的问题,中位数是第(len_1 + len_2) / 2 + 1大的数。
2.令pa = k / 2, pb= k - pa, 如果第一序列的第pa个元素小于第二序列第pb个元素 不能确定二序列第pb个元素偏大或偏小,但第二序列的前pb个元素都小于目标K,将第一个序列前pa个元素全部抛弃,形成一个较短的新序列。k = k-pa
3.同理,如果第一个序列第p个元素大于第二个序列第q个元素,抛弃第二个序列的前q个元素。k = k - pb
4.如此递归 当较短序列全被抛弃,则返回较长序列的第 k 个元素 或者 当第pa个元素和第pb个元素相等时,即为中位数;当k = 1 时 返回min(a[0], b[0])