字符串part01

news/2024/11/17 16:36:01/文章来源:https://www.cnblogs.com/yuehuaicnblogs/p/18349774

今天学了字符产的第一部分:

  1. 反转字符串,使用双指针。
  2. 反转字符串Ⅱ,需要固定规律一段一段去处理字符串的时候,要想想在在for循环的表达式上做做文章。
  3. 数组填充问题,其做法都是先预先给数组扩容带填充后的大小,然后在从后向前进行操作。

1. 反转字符串

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

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


和反转链表一样,使用双指针解决问题。但是比链表更简单,字符串明显可以知道长度,所以开头一个结尾一个,两两交换即可。

void reverseString(vector<char>& s) {for (int i = 0, j = s.size() - 1; i < s.size()/2; i++, j--) {swap(s[i],s[j]);}
}

2. 反转字符串Ⅱ

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

如果剩余字符少于 k 个,则将剩余字符全部反转。

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

输入: s = "abcdefg", k = 2
输出: "bacdfeg"


每次看2k个,因此在遍历字符串的过程中,只要让 i += (2 * k),i 每次移动 2 * k 就可以了,然后判断是否需要有反转的区间。

当需要固定规律一段一段去处理字符串的时候,要想想在在for循环的表达式上做做文章。

string reverseStr(string s, int k) {for (int i = 0; i < s.size(); i += (2 * k)) {// 1. 每隔 2k 个字符的前 k 个字符进行反转// 2. 剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符if (i + k <= s.size()) {reverse(s.begin() + i, s.begin() + i + k );} else {// 3. 剩余字符少于 k 个,则将剩余字符全部反转。reverse(s.begin() + i, s.end());}}return s;
}

若是自己实现reverse,和上头第一题的思路一样:

class Solution {
public:void reverse(string& s, int start, int end) {for (int i = start, j = end; i < j; i++, j--) {swap(s[i], s[j]);}}string reverseStr(string s, int k) {for (int i = 0; i < s.size(); i += (2 * k)) {// 1. 每隔 2k 个字符的前 k 个字符进行反转// 2. 剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符if (i + k <= s.size()) {reverse(s, i, i + k - 1);continue;}// 3. 剩余字符少于 k 个,则将剩余字符全部反转。reverse(s, i, s.size() - 1);}return s;}
};

3. 替换数字

题目:给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。

例如,对于输入字符串 "a1b2c3",函数应该将其转换为 "anumberbnumbercnumber"


直接的想法是再开一个数组,根据遍历到的原始数组中的内容,往新数组里填内容。但是,为了不使用额外空间,可以选择:

  1. 很多数组填充类的问题,其做法都是先预先给数组扩容带填充后的大小,然后在从后向前进行操作。

  2. s.resize(s.size() + count * 5);resize的用法。

这么做有两个好处:

  1. 不用申请新数组。
  2. 从后向前填充元素,避免了从前向后填充元素时,每次添加元素都要将添加元素之后的所有元素向后移动的问题。
img
#include <iostream>
using namespace std;
int main() {string s;while (cin >> s) {int sOldIndex = s.size() - 1;int count = 0; // 统计数字的个数for (int i = 0; i < s.size(); i++) {if (s[i] >= '0' && s[i] <= '9') {count++;}}// 扩充字符串s的大小,也就是将每个数字替换成"number"之后的大小s.resize(s.size() + count * 5);int sNewIndex = s.size() - 1;// 从后往前将数字替换为"number"while (sOldIndex >= 0) {if (s[sOldIndex] >= '0' && s[sOldIndex] <= '9') {s[sNewIndex--] = 'r';s[sNewIndex--] = 'e';s[sNewIndex--] = 'b';s[sNewIndex--] = 'm';s[sNewIndex--] = 'u';s[sNewIndex--] = 'n';} else {s[sNewIndex--] = s[sOldIndex];}sOldIndex--;}cout << s << endl;       }
}

今日古诗

促拍丑奴儿 乡邻会饮,有请予增损旧曲者,
金朝 元好问

无物慰蹉跎。
占一丘、一壑婆娑。
闲来点检平生事,天南地北,几多尘土,何限风波。

花坞与松坡。
尽先生、少小经过。
老来诗酒犹堪任,家山在眼,亲朋满坐,不醉如何。

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

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

相关文章

upload-labs第21关分析与答案

upload-labs第21关审计1 第二十一关的参考代码 $is_upload = false; $msg = null; if(!empty($_FILES[upload_file])){//检查MIME$allow_type = array(image/jpeg,image/png,image/gif);if(!in_array($_FILES[upload_file][type],$allow_type)){$msg = "禁止上传该类型文件…

知攻善防Web1应急靶机笔记--详解

知攻善防Web1应急靶机笔记 概述 这是一台知攻善防实验室的应急响应靶机,方便大家练习一下应急响应的流程和操作。 靶机的前景概述:前景需要: 小李在值守的过程中,发现有CPU占用飙升,出于胆子小,就立刻将服务器关机,这是他的服务器系统,请你找出以下内容,并作为通关条件…

Java方法06:递归

A方法调用B方法,我们很容易理解! 递归就是:A方法调用A方法!就是自己调用自己,因此我们在设计递归算法时,一定要指明什么时候自己不调用自己。否则,就是个死循环! 递归算法重点: 递归是一种常见的解决问题的方法,即把问题逐渐简单化。递归的基本思想就是“自己调用自己…

Redis学习笔记_1_基本安装与使用

黑马程序员Redis学习笔记一:Redis基本概念、安装使用、常见命令、Java客户端Redis 入门篇 1 初识Redis Redis是一种 键值型 的 NoSql 数据库键值型:指Redis中存储的数据都是以key、value对的形式存储,而value的形式多种多样,可以是字符串、数值、甚至json NoSql:相对于传统…

数学

20240806 课件marp: true math: mathjax 数论入门 整除、同余、数论函数、素数………………………… by RenaMoe不讲证明的地方是因为用处不大而且俺也不会,请自行了解。 想要严谨而系统的学习 OI 相关的数学知识的话,建议读《具体数学》。基础概念 oi wiki整除 对于正整数 \…

04 课后题

04 课后题解释以下命令 mkdir /root/dir1 在root下创建一个目录 dir1 touch /root/dir1/file{1..10} 在/root/dir1/file 创建 file1—10 一共十个文件 find /root/dir1 -type f -name "file5" 使用find命令在 /root/dir1目录下 名字叫file5 的文件 find /root/dir1 …

notepad++安装HexEdit插件

notepad++安装HexEdit插件 打开notepad++,选择插件—>插件管理在这里找到HexEdit点击安装就可以点击完,notepad++会自动重启,重启完成就安装好了

用Python简单操作MySQL!轻松实现数据读写

PyMySQL是Python编程语言中的一个第三方模块,它可以让Python程序连接到MySQL数据库并进行数据操作。它的使用非常简单,只需要安装PyMySQL模块,然后按照一定的步骤连接到MySQL数据库即 可。本文将介绍PyMySQL的安装、连接MySQL数据库、创建表、插入数据、查询数据、更新数据和…

1.13 - 动手学聚类算法

1. 基于距离的k-means聚类,需要人工提供聚簇数量K 1.1 通过肘方法确定最佳聚簇数量import numpy as np import matplotlib.pyplot as plt from sklearn.cluster import KMeans from sklearn.preprocessing import StandardScaler from sklearn.datasets import make_blobs, lo…

Linux C++ 开发2 - 编写、编译、执行第一个程序

上一篇《Linux C++ 开发1 - 搭建C++开发环境》我们搭建好了C++的开发环境,本篇我们将编写、编译、执行第一个程序。 1. 第一个C++程序 1.1. demo01.cpp 这里写一个最简单的HelloWord程序 #include <iostream>int main() {std::cout << "Hello, world!" …

洛谷P1194 买礼物之警钟敲爆

洛谷P1194题解传送锚点摸鱼环节 买礼物 题目描述 又到了一年一度的明明生日了,明明想要买 \(B\) 样东西,巧的是,这 \(B\) 样东西价格都是 \(A\) 元。 但是,商店老板说最近有促销活动,也就是: 如果你买了第 \(I\) 样东西,再买第 \(J\) 样,那么就可以只花 \(K_{I,J}\) 元…

CSP16

这题,唯一坑点,子序列是不连续的 注意,子序列可以不连续,子串必须连续。 有一个很显然的暴力点击查看代码 int dp[N][N],n,p[N],q[N]; int main() {speed();freopen("in.in","r",stdin);freopen("out.out","w",stdout);cin>>n…