LeetCode刷题笔记之字符串

一、反转字符串

1. 344【反转字符串】

  • **题目:**编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
  • 代码:
class Solution {public void reverseString(char[] s) {//交换两个数:a^=b; b^=a; a^=b;//双指针法反转数组int left = 0;int right = s.length-1;while (left < right){s[left] ^= s[right];s[right] ^= s[left];s[left] ^= s[right];left++;right--;}}
}

2. 541【反转字符串II】

  • 题目: 给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
    • 如果剩余字符少于 k 个,则将剩余字符全部反转。
    • 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
  • 代码:
class Solution {public String reverseStr(String s, int k) {char[] charArr = s.toCharArray();//不要用k做除数,因为k可能为0for (int i = 0; i < s.length(); i+=2*k) {if(i + k > s.length()){reverse(charArr,i,s.length()-1);break;}reverse(charArr,i,i+k-1);}String str = String.valueOf(charArr);return str;}public void reverse(char[] s,int left,int right) {while (left < right){s[left] ^= s[right];s[right] ^= s[left];s[left] ^= s[right];left++;right--;}}
}

3. 151【翻转字符串里的单词】

  • 题目: 给你一个字符串 s ,请你反转字符串中单词的顺序。单词是由非空格字符组成的字符串。s中使用至少一个空格将字符串中的单词分隔开。返回单词顺序颠倒且单词之间用单个空格连接的结果字符串。
    注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。
  • 代码:
class Solution {public String reverseWords(String s) {//去除多余的空格,先去除首尾空格,使用whileStringBuilder sb = new StringBuilder();int left = 0;int right = s.length()-1;while (s.charAt(left) == ' '){left++;}while (s.charAt(right) == ' '){right--;}for (int i = left; i < right+1; i++) {if(s.charAt(i)==' ' && s.charAt(i-1)==' '){continue;}sb.append(s.charAt(i));}//反转整个字符串int len = sb.length();char[] charArr = new char[len];for (int i = 0; i < len; i++) {charArr[i] = sb.charAt(len-i-1);}//将每个单词反转回正常顺序left = 0;for (int i = 0; i < len; i++) {if(charArr[i] == ' '){reverse(charArr,left,i-1);left = i+1;}if(i == len-1){reverse(charArr,left,i);}}String str = String.valueOf(charArr);return str;}public void reverse(char[] s,int left,int right) {while (left < right){s[left] ^= s[right];s[right] ^= s[left];s[left] ^= s[right];left++;right--;}}
}

4. 卡码网【右旋字符串】

  • 题目: 字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k,请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。
    例如,对于输入字符串 “abcdefg” 和整数 2,函数应该将其转换为 “fgabcde”。
    输入:输入共包含两行,第一行为一个正整数 k,代表右旋转的位数。第二行为字符串 s,代表需要旋转的字符串。
    输出:输出共一行,为进行了右旋转操作后的字符串。
  • 代码:
import java.util.Scanner;
public void reverse(char[] s,int left,int right) {while (left < right){s[left] ^= s[right];s[right] ^= s[left];s[left] ^= s[right];left++;right--;}
}
public void rightReverse(){Scanner scan = new Scanner(System.in);String s = scan.next();int k = scan.nextInt();//右旋k,代表字符串最后k个字符会移动到前k个,前n-k个字符会移动到后n-k的位置//将该字符串看成两个子串,分别由前n-k个字符,后k个字符组成//反转整个字符串,在分别对两个子串进行反转char[] charArr = s.toCharArray();reverse(charArr,0,s.length()-1);reverse(charArr,0,k-1);reverse(charArr,k,s.length()-1);System.out.println(String.valueOf(charArr));
}

二、替换字符串中某些字符

1. 卡码网【替换数字】

  • 题目: 给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。
    例如,对于输入字符串 “a1b2c3”,函数应该将其转换为 “anumberbnumbercnumber”。
    对于输入字符串 “a5b”,函数应该将其转换为 “anumberb”
    输入:一个字符串 s,s 仅包含小写字母和数字字符。
    输出:打印一个新的字符串,其中每个数字字符都被替换为了number
    样例输入:a1b2c3
    样例输出:anumberbnumbercnumber
    数据范围:1 <= s.length < 10000。
  • 代码:
import java.util.Scanner;
public void replaceDigit(){Scanner scan = new Scanner(System.in);String s = scan.next();StringBuilder sb = new StringBuilder();for (int i = 0; i < s.length(); i++) {//判断是否为数字:Character.isDigit(s.charAt(i));if(s.charAt(i)>='0' && s.charAt(i)<='9'){sb.append("number");}else{sb.append(s.charAt(i));}}scan.close();System.out.println(sb);
}

三、KMP算法

1. 28【找出字符串中第一个匹配项的下标】

  • 题目: 给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1 。
    示例 1:
    输入:haystack = “sadbutsad”, needle = “sad”
    输出:0
    解释:“sad” 在下标 0 和 6 处匹配。第一个匹配项的下标是 0 ,所以返回 0 。
  • 代码:
class Solution {public int strStr(String haystack, String needle) {//如果needle的长度为0,则返回0if(needle.length() == 0){return 0;}//使用KMP算法进行匹配字符串,原理是找到最长相等前后缀,使用next数组记录最长相等前缀的下标//KMP算法求next数组,初始化next数组,next[0]=0int[] next = new int[needle.length()];int j = 0;//j表示最长前缀的末尾,初始值为0next[j] = 0;//i表示后缀的末尾,初始值为1for (int i = 1; i < needle.length(); i++) {//判断前缀的末尾是否与后缀的末尾相等//不相等,则查看当前最长前缀的最长前缀值,即更改j的值,直到j==0或相等为止while (j>0 && needle.charAt(i)!=needle.charAt(j)){j = next[j-1];}//相等,则i和j均后移一位,比较下一个位置是否相等if(needle.charAt(i) == needle.charAt(j)){++j;}//为当前位置的next赋值next[i] = j;}j = 0;for (int i = 0; i < haystack.length(); i++) {while (j>0 && haystack.charAt(i)!=needle.charAt(j)){j = next[j-1];}if(haystack.charAt(i) == needle.charAt(j)){j++;}if(j == needle.length()){return i-needle.length()+1;}}return -1;}
}

2. 459【重复的子字符串】

  • 题目: 给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。
  • 代码:
class Solution {public boolean repeatedSubstringPattern(String s) {//如果s是由某一子串重复组成,则它的最长相等前缀与s的长度相差一个重复子串的长度//s的长度一定可以被重复子串的长度整除//KMP求最长相等前缀,next数组的最后一项不为0,则有相等前后缀//最长相等前后缀的长度为next数组的最后一项值//求next数组int len = s.length();int[] next = new int[len];int j = 0;next[j] = 0;for (int i = 1; i < len; i++) {while (j>0 && s.charAt(i)!=s.charAt(j)){j = next[j-1];}if(s.charAt(i) == s.charAt(j)){j++;}next[i] = j;}//判断是否有相等前后缀if(next[len-1]>0 && len%(len-next[len-1])==0){return true;}return false;}
}

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

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

相关文章

python初试六

之前了解了&#xff1a; 创建Django项目 数据库 模板 表格提交 admin管理页面 上面的功能模块允许我们做出一个具有互动性的站点&#xff0c;但无法验证用户的身份。我们这次了解用户验证部分。通过用户验证&#xff0c;我们可以根据用户的身份&#xff0c;提供不同的服务。 …

TiDB SQL调优案例TiFlash

背景 早上收到某系统的告警tidb节点挂掉无法访问&#xff0c;情况十万火急。登录中控机查了一下display信息&#xff0c;4个TiDB、Prometheus、Grafana全挂了&#xff0c;某台机器hang死无法连接&#xff0c;经过快速重启后集群恢复&#xff0c;经排查后是昨天上线的某个SQL导…

openwrt源码编译

下载openwrt源码 git clone https://github.com/openwrt/chaos_calmer.git // 官方下载地址 当前我们基于15.05版本开发&#xff0c;如果开发者想用最新的OpenWRT系统&#xff0c;可以下载 https://github.com/openwrt/openwrt.git git clone https://github.com/Ying-Yun/o…

OpenGL 绘制Mesh数据(Qt)

文章目录 一、简介二、实现代码三、实现效果一、简介 Mesh数据的结构主要就是点与三角面片,因此本质上仍然是对三角面片进行绘制。这里我们借助VCG这个库实现对Mesh数据的读取,这个库相对简单轻巧,很方便使用。 二、实现代码 由于修改的部分很多,我们逐一进行解释一下: --…

Seata 中封装了四种分布式事务模式,分别是: AT 模式, TCC 模式, Saga 模式, XA 模式,

文章目录 seata概述Seata 中封装了四种分布式事务模式&#xff0c;分别是&#xff1a;AT 模式&#xff0c;TCC 模式&#xff0c;Saga 模式&#xff0c;XA 模式&#xff0c; 今天我们来聊聊seata seata 概述 在微服务架构下&#xff0c;由于数据库和应用服务的拆分&#xff0c…

计算机专业校招常见面试题目总结

博主面试岗位包括&#xff1a;java开发、软件测试、测试开发等岗位&#xff0c;基于之前经历的面试总结出的一些常见题目。仅供参考&#xff0c;互相学习&#xff01;&#xff01; 八股&#xff1a;java开发、测试、测开岗位 Java技术栈&#xff1a;Java基础、JVM、数据结构、…

【SAM系列】Auto-Prompting SAM for Mobile Friendly 3D Medical Image Segmentation

论文链接&#xff1a;https://arxiv.org/pdf/2308.14936.pdf 核心&#xff1a; finetune SAM,为了不依赖外部prompt&#xff0c;通过将深层的特征经过一个编-解码器来得到prompt embedding&#xff1b;finetune完之后做蒸馏

PTA-感染人数

设某住宿区域是一个nn的方阵&#xff0c;方阵中的每个小方格为一个房间&#xff0c;房间里可能住一个人&#xff0c;也可能空着。第一天&#xff0c;某些房间中住着的人得了一种高传染性的流感&#xff0c;以后每一天&#xff0c;得流感的人会使其邻居&#xff08;住在其上、下…

76 Python开发-内外网收集Socket子域名DNS

目录 Python开发相关知识点本篇文章涉及知识点演示案例:IP&Whois&系统指纹获取代码段-外网CDN&子域名&端口扫描&交互代码段-外网IP&计算机名&存活主机&端口扫描代码段-内网Py格式解析环境与可执行程序格式转换-Pyinstaller 涉及资源&#xff1…

git 学习 之一个规范的 commit 如何写

最好的话做一件完整的事情就提交一次

WPF 显示gif动态图

WPF显示gif动态图有以下几种方式&#xff1a; 使用Storyboard使用WpfAnimatedGif(NuGet包管理器安装WpfAnimatedGif)使用ImageAnimator使用Winform控件PictureBox使用MediaElement通过GifBitmapDecoder解析GIF图片&#xff0c;获取gif帧数和每一帧数据&#xff0c;然后通过时间…

一种删除 KubeSphere 中一直卡在 Terminating 的 Namespace--KubeSphere Logging System的简单方法

文章目录 一、问题提出二、删除方法1&#xff0c;获取kubesphere-logging-syste的详细信息json文件2&#xff0c;编辑kubesphere-logging-system.json3&#xff0c;执行清理命令 三、检查结果 一、问题提出 在使用 KubeSphere 的时候发现有一个日志服务KubeSphere Logging Sys…

ARM CCA机密计算软件架构之设备分配(Device Assignment)

这个指南的前几节展示了领域提供的执行环境,它与正常世界的Rich OS、Hypervisor和TrustZone完全隔离。领域可以在初始化时完全通过认证,以确保其初始内容,并确保它在基于RME的平台上运行。 在大多数操作情况下,任何领域软件执行都需要访问系统中可用的设备。默认情况下,系…

MySQL-长事务详解

您好&#xff0c;我是码农飞哥&#xff08;wei158556&#xff09;&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f4aa;&#x1f3fb; 1. Python基础专栏&#xff0c;基础知识一网打尽&#xff0c;9.9元买不了吃亏&#xff0c;买不了上当。 Python从入门到精…

YoloV8改进策略:基于自研的图注意力机制改进| 独家改进方法|图卷积和注意力融合模块

摘要 SE注意力机制是一种通过显式建模卷积特征的信道之间相互依赖性的方法,旨在提高网络产生的表示的质量。SE注意力机制包括两个步骤:Squeeze和Excitation。在Squeeze步骤中,通过全局平均池化操作将输入特征图压缩成一个向量,然后通过一个全连接层将其映射到一个较小的向…

HTML的学习记录

<br /> 标签在 HTML 页面中创换行符。 <hr /> 标签在 HTML 页面中创建水平线。 段落是通过 <p> 标签定义的。 浏览器会自动地在段落的前后添加空行。&#xff08;<p> 是块级元素&#xff09; 文本格式 <b>This text is bold</b>字体加粗 …

Mybatis 动态 SQL - if

MyBatis的一个最强大的特性一直都是其动态SQL能力。如果你有使用JDBC或任何类似框架的经验&#xff0c;你就会明白在条件下连接SQL字符串是多么痛苦&#xff0c;需要确保不忘记添加空格或在列名列表的末尾遗漏逗号。动态SQL处理起来非常痛苦。 尽管使用动态SQL可能不会很轻松&…

2024年最新软件测试必问面试题,面试前一天刷效果更佳

1.你为什么选择软件测试行业 因为之前有了解软件测试这个行业&#xff0c;觉得他的发展前景很好。 2.根据你以前的工作经验描述一下软件开发、测试过程&#xff0c;由那些角色负责&#xff0c;你做什么 要有架构师、开发经理、测试经理、程序员、测试员。我在里面主要是负责所…

HOJ 项目部署-前端定制 默认勾选显示标签、 在线编辑器主题和字号大小修改、增加一言功能 题目AC后礼花绽放

# 项目拉取地址&#xff1a; https://gitee.com/himitzh0730/hoj.git # 切换到hoj-vue目录执行以下命令 #安装依赖 npm install #运行服务 npm run serve #修改代码后构建项目到dist文件夹&#xff0c;到服务器docker-compose.yml中修改hoj-frontend文件映射即可 npm run build…

dvwa问题篇 -- dvwa出现数据库无法访问的时候,Could not connect to the MySQL service. -- 小黑解决教程

各位小伙伴初次玩dvwa会出现各种问题&#xff0c;本来想把一些问题直接总结写一篇dvwa文章来着&#xff0c;但因为都是关键字搜索&#xff0c;所以将一些问题都拆分出来&#xff0c;以便大家方便查类似问题。&#xff08;大家有遇到不一样的问题欢迎投稿&#xff01;&#xff0…