剑指 Offer 57 至 58 - II 题解
Posted 风去幽墨
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指 Offer 57 至 58 - II 题解相关的知识,希望对你有一定的参考价值。
剑指 Offer 57. 和为s的两个数字
题意:
输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。
题解:
双指针。
利用数组有序性,可以通过双指针达到一次遍历出结果的目的。
记左右指针分别为i,j。分别指向数组最小元素最大元素。
每次向右移动左指针i时,都调整右指针j直至左右指针指向元素之和小于等于target。
代码:
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
i,j =0,len(nums)-1
for i in range(len(nums)):
x = target-nums[i]
while i<j and j>=0 and nums[j]>x:
j-=1
if i>=j or j<0:
break
if nums[j]==x:
return [nums[i],nums[j]]
return []
剑指 Offer 57 - II. 和为s的连续正数序列
题意:
输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。
序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。
题解:
解法一:暴力枚举区间左右端点(1252 ms)
解法二:双指针(滑动窗口)(104 ms)
记当前窗口内和位sum,左右端点为l,r
若sum<target:则窗口右加一格,sum+=r
若sum==target:符合题目要求
若sum>target:则窗口左减一格,sum-=l
代码:
#法一
class Solution:
def findContinuousSequence(self, target: int) -> List[List[int]]:
def cal(n:int)->int:
return (n+1)*n/2
ans,l,r = [],1,2
while l<=target//2:
sum = cal(r)-cal(l-1)
if sum<target:
r+=1
elif sum == target:
ans.append(list(range(l,r+1)))
l,r=l+1,l+2
elif sum>target:
l,r=l+1,l+2
return ans
#法二
class Solution:
def findContinuousSequence(self, target: int) -> List[List[int]]:
ans,l,r,sum = [],1,2,3
while l<=target//2:
if sum<target:
r+=1
sum+=r
elif sum == target:
ans.append(list(range(l,r+1)))
sum-=l
l=l+1
elif sum>target:
sum-=l
l=l+1
return ans
剑指 Offer 58 - I. 翻转单词顺序
题意:
输入一个英文句子,翻转句子中单词的顺序。
题解:
利用python 的split()函数很好实现。
PS:split()与split(’ ')的区别:
split()会把多个空格当成一个空格
split()只会按照一个空格去处理
代码:
class Solution:
def reverseWords(self, s: str) -> str:
return ' '.join(s.split()[::-1])
剑指 Offer 58 - II. 左旋转字符串
题意:
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。定义一个函数实现字符串左旋转操作的功能
题解:
python切片
代码:
class Solution:
def reverseLeftWords(self, s: str, n: int) -> str:
return s[n:]+s[:n]
以上是关于剑指 Offer 57 至 58 - II 题解的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode剑指 Offer 58 - II. 左旋转字符串(C++)
力扣1190/6/剑指Offer57-II/58-I/-II
LeetCode(剑指 Offer)- 58 - II. 左旋转字符串