剑指offer 41-66题解

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值