代码随想录刷题笔记(DAY 8)

今日总结:最后一道题解决的比较糟糕,后续会补上新解法,今天还是将中心放在了前端。

Day 8

01. 反转字符串(No. 344)

题目链接

代码随想录题解

1.1 题目

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。

不要给另外的数组分配额外的空间,你必须**原地修改输入数组**、使用 O(1) 的额外空间解决这一问题。

示例 1:

输入:s = [“h”,“e”,“l”,“l”,“o”]
输出:[“o”,“l”,“l”,“e”,“h”]

示例 2:

输入:s = [“H”,“a”,“n”,“n”,“a”,“h”]
输出:[“h”,“a”,“n”,“n”,“a”,“H”]

提示:

  • 1 <= s.length <= 105
  • s[i] 都是 ASCII 码表中的可打印字符
1.2 笔记

非常简单的一道题目,而且题目给的就是一个 char 数组,简单的回顾一下反转的写法

char temp = s[left];
s[left] = s[right];
s[right] = temp;

反转的次数为 s.length / 2 向下取整,写出代码

1.3 代码
class Solution {public void reverseString(char[] s) {int n = s.length / 2;int left = 0;int right = s.length - 1;while (n-- > 0) {char temp = s[left];s[left] = s[right];s[right] = temp;left++;right--;}}
}

02. 反转字符串 II(No. 541)

题目链接

代码随想录题解

2.1 题目

给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。

  • 如果剩余字符少于 k 个,则将剩余字符全部反转。
  • 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

示例 1:

输入:s = “abcdefg”, k = 2
输出:“bacdfeg”

示例 2:

输入:s = “abcd”, k = 2
输出:“bacd”

提示:

  • 1 <= s.length <= 104
  • s 仅由小写英文组成
  • 1 <= k <= 104
2.2 笔记

这道题比前面那个复杂的多,有很多条件需要考虑,我们先来尝试读懂题意:

我们可以声明两个指针,这两个指针表明一个 [nk, n2k] 的范围,这个范围不断向后移动,每次出现一次这个范围我们就将前 k 个元素反转。

比如第一次反转的是 [0, k] 第二次是 [2k + 1, 3k]

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

前面的都很好理解,就是当最后一个 2k 跃出数组的时候(比如上图的 8k),对于这一组的 7k 就要分两种情况了

  • 如果 7k 也在数组外的话,我们就将 6k + 1 到数组结尾的内容全部反转
  • 否则就只反转 [6k + 1, 7k]的部分。

看了上面的步骤,我们需要一个函数,能够将我们指定起点到指定终点的内容执行反转,有了上题的经验,这个应该很容易写出来

    public void reverseCharArrayByIndex(int indexLeft, int indexRight) {// 反转在范围内的下标int length = (indexRight - indexLeft + 1) / 2;while (length-- > 0) {char temp = x[indexLeft];x[indexLeft] = x[indexRight];x[indexRight] = temp;indexLeft++;indexRight--;}}

接下来,就要用两个指针去遍历了,第一个指针right每次移动 2k 的距离,第二个指针指向的是 right - 2k + 1 的位置这个 +1 就是我们上面比如 2k + 1 中要加的这个 1,是为了更新范围的。

循环结束的时间就是当我们发现 right 跃出数组的时候,这时候我们就可以对上面出现的两种情况来分别求解了

2.3 代码
class Solution {char[] x;public String reverseStr(String s, int k) {x = s.toCharArray();int left = 0; // k 处的下标int right = (2 * k - 1); // 2k 处的下标int n = 1;// 记录是第几个 2kwhile (true) {// 表示遍历到终点了if (right >= x.length - 1) {// 最后一次处理放在循环结束后做break;}reverseCharArrayByIndex(left, left + k - 1);n++; // 表明下一次right = n * 2 * k - 1;left = right - 2 * k + 1;            }if (x.length - left > k) {reverseCharArrayByIndex(left, left + k - 1);} else {reverseCharArrayByIndex(left, x.length - 1);}return String.valueOf(x);}public void reverseCharArrayByIndex(int indexLeft, int indexRight) {// 反转在范围内的下标int length = (indexRight - indexLeft + 1) / 2;while (length-- > 0) {char temp = x[indexLeft];x[indexLeft] = x[indexRight];x[indexRight] = temp;indexLeft++;indexRight--;}}
}

03. 反转字符串中的单词

题目链接

代码随想录题解

3.1 题目

给你一个字符串 s ,请你反转字符串中 单词 的顺序。

单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。

返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。

**注意:**输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。

示例 1:

输入:s = “the sky is blue”
输出:“blue is sky the”

示例 2:

输入:s = " hello world "
输出:“world hello”
解释:反转后的字符串中不能存在前导空格和尾随空格。

示例 3:

输入:s = “a good example”
输出:“example good a”
解释:如果两个单词间有多余的空格,反转后的字符串需要将单词间的空格减少到仅有一个。

提示:

  • 1 <= s.length <= 104
  • s 包含英文大小写字母、数字和空格 ' '
  • s至少存在一个 单词
3.2 笔记

这道题目目前只是做出了一个解法,时间复杂度很高,我这里先将这个方法讲述一下,后面学到新方法会补上。

我们先利用 split 函数将字符串按照空格分割,得到一个数组,然后我们会得到一个新的数组,这个数组中可能包含空字符串。

我们对这个新的字符串数组进行反转,

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这时可能会有疑惑,这里面不相干的元素不会影响我们反转吗?

我们假想一个数组,在里面随意添加好多不相干的元素,将这个数组反转之后把不相干的元素去掉,结果和直接反转数组效果是一样的。

反转后依次取出元素,如果里面的不是 “” 空字符串我们就将它前面加上空格,再拼接到结果字符串中

为什么是前面呢?

因为可以规避最后一个元素后面多加一个空格的情况,转化为处理第一位多加空格的情况,只需要返回一个 res.substring(1); 即可,而不是要写 res.substring(0, res.length - 1);

3.3 代码
class Solution {public String reverseWords(String s) {String[] words = s.split(" ");int n = words.length / 2;int left = 0;int right = words.length - 1;String res = "";while (n-- > 0) {String temp = words[left];words[left] = words[right];words[right] = temp;left++;right--;}for (int i = 0; i < words.length; i++) {if (words[i] != "") {res += " " + words[i];}            }return res.substring(1);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/319152.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

imgaug库指南(一):从入门到精通的【图像增强】之旅

文章目录 引言imgaug简介安装和导入imgaug代码示例imgaug的强大之处和用途小结结尾 引言 在深度学习和计算机视觉的世界里&#xff0c;数据是模型训练的基石&#xff0c;其质量与数量直接影响着模型的性能。然而&#xff0c;获取大量高质量的标注数据往往需要耗费大量的时间和…

Python Web框架FastAPI——一个比Flask和Tornada更高性能的API框架

目录 一、FastAPI框架概述 二、FastAPI与Flask和Tornado的性能对比 1、路由性能 2、请求处理性能 3、内存占用 三、FastAPI的优点与特色 四、代码示例 五、注意事项 六、结论 在当今的软件开发领域&#xff0c;快速、高效地构建API成为了许多项目的关键需求。为了满足…

OpenCV中实现图像旋转的方法

OpenCV中实现图像旋转的方法 函数&#xff1a;cv2.flip() 功能&#xff1a;水平或者垂直翻转 格式&#xff1a;dst cv2.flip(src,flipCode[,dst]) 参数说明&#xff1a; src&#xff1a;输入图像 dst&#xff1a;和原图像具有相同大小、类型的目标图像。 flipCode&#…

Z-score 因子的深入思考

最新&#xff08;2024 年 1 月&#xff09;出版的 SC 技术分析&#xff08;Techical Analysis of Stock & Commodities&#xff09;的第 4 条文章给到了 Z-score&#xff0c;原文标题为《Z-score: How to use it in Trading》。今天的笔记&#xff0c;就借此机会&#xff0…

wireshark抓包分析HTTP协议,HTTP协议执行流程,

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 使用WireShark工具抓取「HTTP协议」的数据包&#…

【壹基金儿童服务站】瑞金站:清捡垃圾 美化环境

1月1日下午&#xff0c;瑞金赋能公益和象湖镇东升社区新时代文明实践站在壹基金儿童社区服务站开展“我是环保小卫士——走进小区捡垃圾“主题活动&#xff0c;帮助小朋友树立爱护环境从小做起&#xff0c;用自己的双手照顾身边的环境&#xff0c;争做环保小卫士&#xff0c;为…

【ikbp】数据可视化DataV

天天查询一些数据&#xff0c;希望来一个托拉拽的展示&#xff0c;部署体验一下可视化大屏 快速搭建快速查询实时更新简单易用 启动服务 数据可视化 静态查询 配置数据 过滤数据 分享

k8s pod基础 1

发布和yaml文件的初步了解。 pod&#xff1a;是k8s中最小的资源管理组件。 pod也是最小化运行容器化的应用的资源管理对象。 pod是一个抽象的概念&#xff0c;可以理解为一个或者多个容器化应用的集合。 在一个pod当中运行一个容器是最常用的方式。 在一个pod当中可以同时…

算法通关村番外篇-数组实现队列

大家好我是苏麟 , 今天来用数组实现一下队列 . 数组实现队列 顺序存储结构存储的队列称为顺序队列&#xff0c;内部使用一个一维数组存储&#xff0c;用一个队头指针 front 指向队列头部节点(即使用int类型front来表示队头元素的下标)&#xff0c;用一个队尾指针rear(有的地方…

C++上位软件通过Snap7开源库访问西门子S7-200/合信M226ES数据块的方法

前言 上一篇文章中介绍了Snap7访问西门子S7-1200/S7-1500 DB块的方法&#xff0c;对于S7-200PLC是没有数据块访问的。S7-200PLC中Snap7只能通过访问MB块&#xff0c;VB块的方法进行和PLC之间的Snap7通信和数据交换。手头没有S7-200PLC故通过合信CTMC M226ES运动控制器进行测试&…

QML 项目中使用 Qt Design Studio 生成的UI界面

作者&#xff1a;billy 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 前言 今天来和大家聊一下 Qt Design Studio 这个软件。这个软件的主要功能是用来快速完成 UI 界面&#xff0c;就和 widget 中的 desig…

【数据结构】一些数组面试题以及顺序表的思考

简单不先于复杂&#xff0c;而是在复杂之后。 文章目录 1. 数组相关面试题2. 顺序表的问题及思考 1. 数组相关面试题 1.原地移除数组中所有的元素val&#xff0c;要求时间复杂度为O(N)&#xff0c;空间复杂度为O(1)。 int removeElement(int* nums, int numsSize, int val) {i…