【代码随想录】字符串

news2024/9/20 16:36:49

本博文为《代码随想录》学习笔记,原文链接:代码随想录

344.反转字符串

题目链接:. - 力扣(LeetCode)

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 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 码表中的可打印字符

为适应机试环境,采用Dev C++编译

示例1

输入:5 h e l l o

输出:o l l e h

示例2

输入:6 H a n n a h

输出:h a n n a H

解法一:设置临时字符tmp直接交换数值

#include <bits/stdc++.h>;
using namespace std;
void reverseString(vector<char>& s) {
	int length=s.size();
	for(int i=0;i<length/2;i++)
	{
		char tmp;
		tmp=s[i];
		s[i]=s[length-1-i];
		s[length-1-i]=tmp;
	}
}
int main()
{
	int n;//数组元素个数
	cin>>n; 
	vector<char> s(n);
	for(int i=0;i<n;i++)
	{
		cin>>s[i];
	}
	reverseString(s);
	for(int i=0;i<s.size();i++)
	{
		cout<<s[i];
	}

	return 0;
	
}

 运行结果

 解法二:直接使用reverse函数(原文不建议)

void reverseString(vector<char>& s) {
	reverse(s.begin(),s.end()); 

}

运行结果

解法三:双指针法

这是代码随想录中题解,其实基本思想和解法一一致,只不过这里使用了swap函数,swap函数有两种实现:

一种就是常见的交换数值(解法一就是将swap函数用这种方式拆开来写)

int tmp = s[i];
s[i] = s[j];
s[j] = tmp;

一种就是通过位运算

s[i] ^= s[j];
s[j] ^= s[i];
s[i] ^= s[j];

代码

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

}

运行结果

替换数字

原题链接:54. 替换数字(第八期模拟笔试)

题目描述

给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。 例如,对于输入字符串 "a1b2c3",函数应该将其转换为 "anumberbnumbercnumber"。

输入描述

输入一个字符串 s,s 仅包含小写字母和数字字符。

输出描述

打印一个新的字符串,其中每个数字字符都被替换为了number

输入示例

a1b2c3

输出示例

anumberbnumbercnumber

提示信息

数据范围:
1 <= s.length < 10000。

思路

首先扩充数组到每个数字字符替换成 "number" 之后的大小。

例如 字符串 "a5b" 的长度为3,那么 将 数字字符变成字符串 "number" 之后的字符串为 "anumberb" 长度为 8。

如图:

然后从后向前替换数字字符,也就是双指针法,过程如下:i指向新长度的末尾,j指向旧长度的末尾。

有同学问了,为什么要从后向前填充,从前向后填充不行么?

从前向后填充就是O(n^2)的算法了,因为每次添加元素都要将添加元素之后的所有元素整体向后移动。

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

这么做有两个好处:

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

代码

#include <bits/stdc++.h>;
using namespace std;

int main()
{
	string s;
	while(cin>>s)
	{
		int count=0;//统计数字的个数 
		for(int i=0;i<s.size();i++)
		{
			if(s[i]<='9'&&s[i]>='0')//活用ASCAII码 
			{
				count++; 
			}
		}
		int StrOldSize=s.size();
		s.resize(s.size()+count*5);
		int StrNewSize=s.size();
		for(int i=StrNewSize-1,j=StrOldSize-1;j<i;i--,j--)
		{
			if(s[j]<'0'||s[j]>'9')
			{
				s[i]=s[j];
			}
			else
			{
				s[i]='r';
				s[i-1]='e';
				s[i-2]='b';
				s[i-3]='m';
				s[i-4]='u';
				s[i-5]='n';
				i=i-5;
			}
		}
		cout<<s<<endl;
	}
	
}

运行结果

  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

实现strStr函数

原题链接. - 力扣(LeetCode)

给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回  -1 

示例 1:

输入:haystack = "sadbutsad", needle = "sad"
输出:0
解释:"sad" 在下标 0 和 6 处匹配。
第一个匹配项的下标是 0 ,所以返回 0 。

示例 2:

输入:haystack = "leetcode", needle = "leeto"
输出:-1
解释:"leeto" 没有在 "leetcode" 中出现,所以返回 -1 。

提示:

  • 1 <= haystack.length, needle.length <= 104
  • haystack 和 needle 仅由小写英文字符组成

 KMP

什么是KMP、KMP有什么用

KMP主要应用在字符串匹配上。

KMP的主要思想就是当出现字符串不匹配时,可以知道一部分之前已经匹配的文本可以利用这些信息避免从头再去做匹配。

什么是前缀表

什么是前缀表:记录下标i之前(包括i)的字符串中,有多大长度的相同前缀后缀。

next数组就是一个前缀表。

前缀表是用来回退的,它记录了模式串与主串(文本串)不匹配的时候,模式串应该从哪里开始重新匹配。

举例:要在文本串:aabaabaafa 中查找是否出现过一个模式串:aabaaf。

可以看出,文本串中第六个字符b 和 模式串的第六个字符f,不匹配了。如果暴力匹配,发现不匹配,此时就要从头匹配了。

但如果使用前缀表,就不会从头匹配,而是从上次已经匹配的内容开始匹配,找到了模式串中第三个字符b继续开始匹配。

首先要知道前缀表的任务是当前位置匹配失败,找到之前已经匹配上的位置,再重新匹配,此也意味着在某个字符失配时,前缀表会告诉你下一步匹配中,模式串应该跳到哪个位置。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Qt使用绿色pdf阅读器打开文件

1.下载SumatraPDF 2.设置 3.代码 void MainWindow::on_pushButton_clicked() {QProcess *process new QProcess();QString filePath "C:\\Users\\jude\\Desktop\\su\\11.pdf";QString sumatraPath "C:\\Users\\jude\\Desktop\\su\\SumatraPDF-3.5.2-64.exe&q…

Android 系统级应用守护进程

import java.util.Random; /** Application class for SystemUI. -42,6 69,8 public class SystemUIApplication extends Application { private static final String TAG “SystemUIService”; private static final boolean DEBUG false; private Context mContext;/*…

嵌入式产品发货后出现问题,怎么办?

目录 1、问题识别与初步诊断 2、影响评估 3、提出临时解决方案 4、根本原因分析与修复 5、修复验证与回归测试 6、修复的部署与客户沟通 7、预防未来类似问题 当嵌入式电子产品已发货且出现问题时&#xff0c;及时采取有效的补救措施是至关重要的。补救步骤应包括问题的…

javascript柯里化

return a b c d; } //通常调用方式 var sum add(1, 2, 3, 4); //柯里化的调用方式 var curryAdd Curry(add); var sum curryAdd(1)(2)(3)(4); //或者很多奇怪的方式调用 var sum curryAdd(1, 2)(3, 4); var sum curryAdd(1, 2, 3)(4); var sum curryAdd(1)(…

C语言 | Leetcode C语言题解之第398题随机数索引

题目&#xff1a; 题解&#xff1a; typedef struct {int *nums;int numsSize; } Solution;Solution* solutionCreate(int* nums, int numsSize) {Solution *obj (Solution *)malloc(sizeof(Solution));obj->nums nums;obj->numsSize numsSize;return obj; }int solu…

Maven之坑setting.xml配置

先来看遇到的问题 在运行 mvn clean package 打包命令的时候&#xff0c;IDEA控制台提示如下 Non-resolvable parent POM for com.xxxxx.xxxxx:1.0.0: The following artifacts could not be resolved: com.xxxxx:xxxxx:pom:1.0.0 (present, but unavailable): xxxxx:xxxxx…

全球热门剪辑软件大搜罗

如果你要为你的视频进行配音那肯定离不开音频剪辑软件&#xff0c;现在有不少音频剪辑软件免费版本就可以实现我们并不复杂的音频剪辑操作。这次我就给你分享几款能提高剪辑效率的音频剪辑工具。 1.福晰音频剪辑 链接直达>>https://www.foxitsoftware.cn/audio-clip/ …

Java面试篇基础部分-Java各种垃圾收集器

导语   在之前的分享中,我们知道Java堆内存被分为新生代和老年代两个部分;其中,新生代中主要存储生命周期较短的对象,了解了新生代中的对象采用的是复制算法进行垃圾回收;而老年代主要存储生命周期较长的对象以及大对象,采用的是标记整理算法进行垃圾回收。 针对不同的…

Es6解构赋值,熟练掌握作用域

5.3 数组的解构赋值 数组的解构赋值是按照前后数据的索引值一一对应的 5.4 前后数据结构也要保持一致,不然解构的可能与原数组解构嵌套不同 5.5 数组解构时的默认值 6 对象的解构赋值 对象的解构赋值是按照key一一解构 7 解构数组,如果有两个值必须写在后面,rest参数 8 解…

VMware账户授权迁移Broadcom账户-操作指南

前言: VMware被Broadcom收购后,大量的国内VMware企业用户获取技术支持的渠道改变。 特别是授权以及开Case的问题。 这篇文章保姆级教学,从你怎么拨打外国电话(并且告诉你背诵英文短语的方式从400处获取答案,不用交流),怎么获取Site ID,以及如何…

湖仓一体-Paimon篇-简介

简介 Apache Paimon 是一种数据湖的格式&#xff0c;支持使用 Flink 和 Spark 构建实时湖仓架构&#xff0c;用于流式和批处理操作。Paimon 创新性地结合了数据湖格式和LSM结构&#xff0c;将实时流式更新引入数据湖架构。 Paimon 提供以下核心功能&#xff1a; ● 实时更新&a…

游戏开发引擎___unity位置信息和unlit shader(无光照着色器)的使用,以桌子的渲染为例

unity是左手坐标系 1.位置信息 1.1 代码 using System.Collections; using System.Collections.Generic; using UnityEngine;public class positionTest : MonoBehaviour {public Camera Camera;private void OnGUI(){//世界坐标系&#xff0c;GUI里的标签GUI.Label(new Rec…

【智能流体力学】机器学习 (ML) 增强计算流体动力学 (CFD) 的最新进展

这篇综述探讨了通过机器学习 &#xff08;ML&#xff09; 增强计算流体动力学 &#xff08;CFD&#xff09; 的最新进展。文献系统地分为三个主要类别&#xff1a;数据驱动的代理、物理知情的代理和 ML 辅助数值解。随后&#xff0c;我们重点介绍了 ML for CFD 在关键科学和工程…

【开发工具】IntelliJ IDEA插件推荐:Json Helper——让JSON处理更高效

导语&#xff1a;在Java开发过程中&#xff0c;JSON作为一种轻量级的数据交换格式&#xff0c;被广泛应用于前后端数据交互。今天&#xff0c;我要为大家介绍一款IntelliJ IDEA插件——Json Helper&#xff0c;帮助开发者更高效地处理JSON数据。 一、什么是Json Helper&#x…

部署定时任务每2天清理一次表

1、创建存储过程 create or replace procedure truct authid current_user ---使用“authid Current_user”将存储过程转化为调用者权限 as begin execute immediate truncate table rep.tmp_s_st_busi_send_arc; end; / 2、创建定时任务 begin dbms_scheduler.create…

Java 内存分析及三种初始化

1&#xff0e;Java内存分析&#xff1a; &#xff08;1&#xff09;堆&#xff1a;①存放new的对象和数组&#xff1b;②可以被所有的线程共享&#xff0c;不会存放别的对象引用。 &#xff08;2&#xff09;栈&#xff1a;①存放基本变量类型&#xff08;包括这个基本类型的…

【网络安全】-xss跨站脚本攻击实战-xss-labs(1~10)

Level1: 检查页面源代码&#xff1a; function函数&#xff1a; (function(){try{let tn ;if(tn.includes(oem)){Object.defineProperty(document, referrer, {get: function(){return ;}});}else if(tn.includes(hao_pg)){if(!document.referrer.match(tn)){Object.definePro…

合宙低功耗4G模组Air780EX——硬件设计手册01

Air780EX是一款基于移芯EC618平台设计的LTECat1无线通信模组。支持FDD-LTE/TDD-LTE的4G远距离无线 传输技术。另外&#xff0c;模组提供了USB/UART/I2C等通用接口满足IoT行业的各种应用诉求。 一、主要性能 1.1 模块功能框图 1.2 模块型号列表 1.3 模块主要性能 *注: 模组…

计算机毕业设计 智能推荐旅游平台 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

Java 每日一刊(第3期):Hello World

文章目录 前言Hello World程序是如何执行的Hello World 里有什么本期小知识 阳光洒进窗台&#xff0c;花香伴着书香&#xff0c;静谧而温暖&#xff0c;仿佛时光停驻。 前言 这里是分享 Java 相关内容的专刊&#xff0c;每日一更。 本期将为大家带来以下内容&#xff1a; “…