41、和为S的连续正数序列
输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。
序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。
解析
在答案区找到一个答案,说的很好,叫做双指针技术,就是相当于有一个窗口,窗口的左右两边就是两个指针,我们根据窗口内值之和来确定窗口的位置和宽度。
class Solution:
def findContinuousSequence(self, target: int) -> List[List[int]]:
res=[]
low,high=1,2
count=low+high
while high< target:
if count>target:
count-=low
low+=1
elif count<target:
high+=1
count+=high
else:
res.append([i for i in range(low,high+1)])
count-=low
low+=1
return res
42、和为S的两个数字
输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S
1.left开头,right指向结尾
2.如果和小于sum,说明太小了,left右移寻找更大的数
3.如果和大于sum,说明太大了,right左移寻找更小的数
4.和相等,把left和right的数返回
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
l,r=0,len(nums)-1
while l<r:
res=nums[l]+nums[r]
if res==target: return [nums[l],nums[r]]
if res>target:r-=1
else:l+=1
return []
43、左旋转字符:
对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。(思路比较难想到!)
//假设输入str为abcXYZdef,n=3
Reverse(str,0,n-1); //反转前n个字符,得到cbaXYZdef
Reverse(str,n,len-1); //反转第n个字符后面所有的字符cbafedZYX
Reverse(str,0,len-1); //反转整个字符串XYZdefabc
class Solution:
def reverseLeftWords(self, s: str, n: int) -> str:
def reverse(low,high):
while low<high:
li[low],li[high]=li[high],li[low]
low+=1
high-=1
li=list(s)
m=len(s)
reverse(0,m-1)
reverse(0,m-1-n)
reverse(m-n,m-1)
return ''.join(li)
44、翻转单词顺序列:
输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. “,则输出"student. a am I”。
视频讲解
class Solution:
def reverseWords(self, s: str) -> str:
res=[]
i=len(s)-1
while i>=0:
if s[i]!=' ':
j=i
while i>=0 and s[i]!=' ':
i-=1
res.append(s[i+1:j+1])
i-=1
return ' '.join(res)
47、求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
class Solution:
def __init__(self):
self.res=0
def sumNums(self, n: int) -> int:
## 如果n>1不成立,则不会进行and后面的递归
n>1 and self.sumNums(n-1)
self.res+=n
return self.res
链表中环的入口结点
https://blog.csdn.net/qq_20141867/article/details/80931915