IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 代码随想录算法训练营day7|Leetcode344/541/05/151/58 -> 正文阅读

[数据结构与算法]代码随想录算法训练营day7|Leetcode344/541/05/151/58

Leetcode 344 反转字符串

链接:344. 反转字符串 - 力扣(LeetCode)

本题目思路依然是使用双指针,这里插个嘴!双指针真的很好用哈哈哈哈尤其是针对数组链表字符串这种题目!强烈建议大家掌握!

?

?(上图来源于代码随想录)

定义左右指针,left = 0&right = len(s)-1?

这里循环退出条件是while left < right,当左右指针重合的时候并没有元素可以反转,所以只需要当他们重合就可以直接退出循环

def reverseString(self, s: List[str]) -> None:
        """
        Do not return anything, modify s in-place instead.
        """
        left =  0
        right = len(s)-1 
        while left<right:
            s[left],s[right] = s[right],s[left]
            left+=1 
            right-=1 
        return s 

Leetcode541反转字符串II

链接:541. 反转字符串 II - 力扣(LeetCode)

思路:

最开始我和大多数同学想的一样,写一个计数器,然后到了第2k的时候在进行判断如何反转。但是实际上不需要这样子。如下图所示(来源于代码随想录)

也就是说 我们只需要确定2k个为一组的字符串,然后反转他的前k个,如果说是奇数个字符比如说’abcde'我们2k之后剩下一个e,需要反转吗?

当然不需要!因为e是我们下一个2k组中的东西 不需要在当前组中进行反转

代码:

def reverseStr(s: str, k: int) -> str:
        #此函数只用来反转
        def reverse_substring(text):
            left = 0 
            right = len(text)-1
            while left<right:
                text[left],text[right] = text[right],text[left]
                left +=1 
                right-=1 
            return text 
        #将字符串改写为list形式
        res = list(s)
        
        #每次走2k个位置,然后直接进行反转
        #每2k相当于一组,组内反转前k个
        #如果是奇数比如说abccde,这里的e需要反转到最前面去吗?
        #不用,首先我们只确定是每2k个位一组,但是e已经是第二个2k里面的字符串了!所以不用管!
        for j in range(0,len(s),2*k):
            res[j:j+k] = reverse_substring(res[j:j+k])
        return ''.join(res)

?Leetcode05 替换空格

链接:剑指 Offer 05. 替换空格 - 力扣(LeetCode)

这道题相对简单。

那么如果让你使用双指针的方法你会吗?

代码:

 def replaceSpace(self, s: str) -> str:
        s = list(s)
        for i in range(len(s)):
            if s[i]==" ":
                s[i] = '%20'
        return ''.join(s)

暴力思路:首先找到对应的" "空格索引,然后用题目给的值替换掉,最后重新join组成新的字符串

双指针法:

首先扩充数组到每个空格替换成"%20"之后的大小。?然后从后向前替换空格,也就是双指针法,过程如下:?i指向新长度的末尾,j指向旧长度的末尾。

?(来源于代码随想录)

为什么这里是从后往前填充?而不是从前向后呢?

因为从前向后会导致后面的元素集体往后移动,时间复杂度就变高了。

? ?所以从后往前填充的好处就是:

  1. 不用申请新数组。
  2. 从后向前填充元素,避免了从前先后填充元素要来的 每次添加元素都要将添加元素之后的所有元素向后移动

代码:

        counter = s.count(' ')
        res = list(s)
        res.extend([' '] * counter * 2)
        left = len(s)-1
        right = len(res)-1 

        while left>=0:
            if res[left]!=' ':
                res[right] = res[left]
                right-=1
            else:
                res[right-2:right+1] = "%20"
                right-=3
            left-=1
        return ''.join(res)

Leetcode151 反转字符串中的单词

链接:151. 反转字符串中的单词 - 力扣(LeetCode)

?思路:

经过了相当长时间的思考!我对这道题已经有了充分理解

总的来说 这道题的思路很巧妙 如果没有掌握这个思路 比较困难实现(针对我个人)

第一步:

把当前字符中的元素都挑出来存到一个数组中去,目的是为了去除前后空格

如果我们过程中遇到了空格那就跳过这个元素,但是包括单词之间间隔的空格,也就是说判断上一次添加的元素是不是空格,如果不是,那么就可以添加,说明我们没有连续两次添加空格!

这样子输出的结果是['t', 'h', 'e', ' ', 's', 'k', 'y', ' ', 'i', 's', ' ', 'b', 'l', 'u', 'e']

第二步:

对于当前数组中的元素进行反转,

也就是我们反转字符串的那道题,直接首位互换。

将会输出:['e', 'u', 'l', 'b', ' ', 's', 'i', ' ', 'y', 'k', 's', ' ', 'e', 'h', 't']

第三步:

做整体的单词反转!

也就是对一个数组中的每个单词进行反转

这里我们定义一个start&end都等于0,目的为了保证我们的头单词不变,然后end循环到空格的时候停下,直接调用我们的这个reverse_array()方法,传入的参数就是当前的数组,start,end的位置。

然后就把我们当前这个’e','u','l','b'成功的反转了。

之后!

start需要更新位置,更新到当前n 的后一位,也就是空格之后的新单词。

所以 start = end+1,然后end+=1。

然后重复的,当我们的end下一次遇到空格的时候,我们start依然指向单词的第一个元素,end指向当前单子后面的空格,然后调用reverse_words函数

最后当我们的end更新到最后,start = end+1u已经循环完毕,直接退出循环。

然后用join连接成一组新的字符串返回。

哈哈哈哈哈哈哈我终于懂了!!!!!!!

先把代码附上:

#
# @lc app=leetcode.cn id=151 lang=python3
#
# [151] 反转字符串中的单词
#

# @lc code=start
from audioop import reverse


class Solution:
    def reverseWords(self, s: str) -> str:
        #去除前后空格
        def delete_space(text):
            left = 0 
            right = len(text)-1 
            while left<=right and text[left]==" ":
                left+=1
            while left<=right and text[right]==" ":
                right-=1 
            result = []

            #去除字符中多余的空格
            while left<=right:
                if text[left]!=" ":
                    result.append(text[left])
                    #如果上一次加入的字符不是空格 但是这一次是空格,说明不是连续的空格 ‘
                    #可以加入
                elif result[-1]!=" ":
                    result.append(text[left])
                left+=1 
            return result 
#输出:['t', 'h', 'e', ' ', 's', 'k', 'y', ' ', 'i', 's', ' ', 'b', 'l', 'u', 'e'

        #反转字符数组
        def reverse_array(s,left,right):
            while left<right:
                s[left],s[right] = s[right],s[left]
                left+=1 
                right-=1
            return None
#输出:['e', 'u', 'l', 'b', ' ', 's', 'i', ' ', 'y', 'k', 's', ' ', 'e', 'h', 't']
        
#反转整个单词
        def reverse_words(words):
            start = 0 
            end = 0 
            n = len(words)
            while start < n:
                while end<n and words[end]!=" ":
                    end+=1
                reverse_array(words,start,end-1)
                start = end+1 
                end+=1
            return None

        letter = delete_space(s)
        reverse_array(letter,0,len(letter)-1)
        reverse_words(letter)
        return ''.join(letter)




                
                





# @lc code=end

Leetcode剑指Offer58-II.左旋转字符串

链接:剑指 Offer 58 - II. 左旋转字符串 - 力扣(LeetCode)

?思路:

通过局部反转+整体反转 达到左旋转的目的。

具体步骤为:

  1. 反转区间为前n的子串
  2. 反转区间为n到末尾的子串
  3. 反转整个字符串

最后就可以得到左旋n的目的,而不用定义新的字符串,完全在本串上操作。

例如 :示例1中 输入:字符串abcdefg,n=2

(来源于代码随想录)?

代码:

#方法1 
        # return s[n:] + s[0:n]





#方法二
        s = list(s)
        #先反转前面的部分
        #例如abcdefg

        s[0:n] = list(reversed(s[0:n]))#得到了ba if n=2

        #再反转后面的部分
        s[n:] = list(reversed(s[n:])) #得到了 gfedc
        # 最后整体反转
        # 现在就是 s=bagfedc
        #然后整体反转
        #得到了cdefgab
        #完成反转
        s.reverse()
        
        return "".join(s)

总结:反转单词是目前遇到的最难的一道题之一

需要好好的啃啃!!!!!

睡觉!

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-10-22 21:39:02  更:2022-10-22 21:47:32 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 20:24:32-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码