算法通关村十二关 | 字符串经典题目

news/2024/5/2 8:54:35/文章来源:https://blog.csdn.net/m0_54138535/article/details/132449774

字符串问题,大家记得模板思路即可,一个类型的题目有很多种。

1. 字符串反转的问题

1.1 反转字符串

题目:LeetCode344:

思路 

还是我们常见的双指针问题,

  • left字符数组头部指针,right字符数组尾部指针。
  • 当left < right,交换元素。
  • 当left >= right,反转结束,返回字符数组。

代码

    /*** 双指针反转字符串* @param s*/public static void reverseString(char[] s){if (s == null || s.length == 0){return;}int n = s.length;for (int left = 0,right = n - 1; left < right; ++left ,--right){char tmp = s[left];s[left] = s[right];s[right] = tmp;}}

1.2 k个一组反转

题目:LeetCode541

思路 

        反转每个下表从2k的倍数开始,长度为k的子字符串,若该字符串长度不为k,则反转整个字符串,注意判断字符串长度不为k的时候。

代码

    public String reverseK(String s, int k){if (s == null || s.length() == 0){return s;}int n = s.length();char[] arr = s.toCharArray();for (int i = 0; i < n; i+= 2* k) {reverse(arr,i, Math.min(i+k,n)-1);}return new String(arr);}public void reverse(char[] arr ,int left, int right){while (left < right){char tmp = arr[left];arr[left] = arr[right];arr[right] = tmp;++left;--right;}}

1.3 仅仅反转字母

题目:

思路一

分析题目后我们知道,只将字符串反转其他符号位置不变

方法一

第一次遍历将s中的多有字符存入栈中,然后第二次遍历所有字符串,遇到字符串就从栈顶元素弹出元素替换,遇到其他符号直接拼接。

代码一

    /*** 使用栈* @param s* @return*/public String reverseOnlyLeeters(String s){Stack<Character> letters = new Stack<>();for (char c :s.toCharArray()) {//c是字符串,则压入if (Character.isLetter(c)){letters.push(c);}}StringBuilder ans = new StringBuilder();for (char c : s.toCharArray()) {//再次遍历,是字符弹栈,不是直接拼接if (Character.isLetter(c)) {ans.append(letters.pop());}else {ans.append(c);}}return ans.toString();}

思路二

方法二双指针

  1. 左指针首部元素,右指针尾部元素
  2. 左指针遇到元素交换,右指针遇到元素停止,遇到其他符号移动

代码二

    /*** 双指针*/public String reverseOnlyletter2(String s){if (s == null || s.length() == 0){return s;}StringBuilder ans = new StringBuilder();int j = s.length() -1;for (int i = 0; i < s.length(); i++) {//第i位是字符,与j位置字符交换if (Character.isLetter(s.charAt(i))){//是字符停止,不是字符移动while (!Character.isLetter(s.charAt(j)))j--;ans.append(j--);}else {//前面不是字符,不用反转ans.append(s.charAt(i));}}return ans.toString();}

1.4 反转字符串里的单词

题目:LeetCode151

思路一

 使用语言提供的方法来解决

  1. trim(),去掉头部和尾部空格
  2. split(),按空格分割成数组
  3. reverse(),将字符串数组反转,每个元素是一个单词
  4. join(),将字符串数组拼接成一个字符串

代码一

    public String reverseWord1(String s){if (s == null || s.length() == 0){return s;}//除去开头和末尾空格s = s.trim();//除去开头和末尾的空白字符作为分割符分割。"s+"匹配多个空白字符List<String> wordlist = Arrays.asList(s.split("\\s+"));Collections.reverse(wordlist);return String.join(" ",wordlist);}

思路二

自己实现上面的方法

1. tirmSpaces(),去掉多余的空白字符,包括开头和结尾

2. reverse(),将每个字符反转,

3. reverseWord(),根据空格反转每个单词

代码二

    /*** 手动实现上述功能*/public String reverseWords(String s){StringBuilder sb = tirmSpaces(s);//反转全部字符串reverse(sb,0,s.length()-1);//反转每个单词reverseWord(sb);return sb.toString();}/*** 去除开头和末尾空格,以及多余的空格*/public StringBuilder tirmSpaces(String s){int left = 0,right = s.length() - 1;//去除开头空格while (left <= right && s.charAt(left) == ' '){++left;}//去除末尾空格while (left <= right && s.charAt(right) == ' '){--right;}//去除中间多余的空格StringBuilder sb = new StringBuilder();while (left <= right){char c = s.charAt(left);if (c != ' '){sb.append(c);//只能有一个空格} else if (sb.charAt(sb.length() - 1) != ' ') {sb.append(c);}++left;}return sb;}//反转字符串啊public void reverse(StringBuilder sb, int left, int right){while (left < right){char tmp = sb.charAt(left);sb.setCharAt(left++,sb.charAt(right));sb.setCharAt(right,tmp);}}//反转单词public void reverseWord(StringBuilder sb){int n = sb.length();//start判断单词的首字母,end判断末尾字母int start = 0 ,end = 0;while (start < n){//循环值单词末尾while (end < n && sb.charAt(end) != ' '){++end;}//反转单个单词reverse(sb,start,end-1);//更新start寻找下一个单词start = end + 1;++end;//此时两个指针是重合状态}}

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

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

相关文章

Java IO流(五)Netty实战[TCP|Http|心跳检测|Websocket]

Netty入门代码示例(基于TCP服务) Server端 package com.bierce.io.netty.simple; import io.netty.bootstrap.ServerBootstrap; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.netty.channel.*; import io.netty.channel.nio.NioEventLoopGro…

智能井盖传感器,物联网智能井盖系统

随着城市人口的不断增加和城市化进程的不断推进&#xff0c;城市基础设施的安全和可靠性变得愈发重要&#xff0c;城市窨井盖作为城市基础设施重要组成部分之一&#xff0c;其安全性事关城市安全有序运行和居民生产生活安全保障。 近年来&#xff0c;各地都在加强城市窨井盖治理…

前端工程化概述

软件工程定义&#xff1a;将工程方法系统化地应用到软件开发中 前端发展历史 前端工程化的发展历史可以追溯到互联网的早期阶段&#xff0c;随着前端技术的不断演进和互联网应用的复杂化&#xff0c;前端工程化也逐渐成为了前端开发的重要领域。以下是前端工程化的主要发展里程…

Shiro学习总结

第一章 入门概述 1.概念 shiro是一个Java安全框架&#xff0c;可以完成&#xff1a;认证、授权、加密、会话管理、与web集成、缓存… 2.优势 ● 易于使用&#xff0c;构建简单 ● 功能全面 ● 灵活&#xff0c;可以在任何应用程序环境中工作&#xff0c;并且不需要依赖它们…

TCP半连接队列和全连接队列

目录 什么是 TCP 半连接队列和全连接队列&#xff1f; TCP 全连接队列溢出 如何知道应用程序的 TCP 全连接队列大小&#xff1f; 如何模拟 TCP 全连接队列溢出的场景&#xff1f; 全连接队列溢出会发生什么 ? 如何增大全连接队列呢 ? TCP 半连接队列溢出 如何查看 TC…

数据结构入门 — 顺序表详解

前言 数据结构入门 — 顺序表详解 博客主页链接&#xff1a;https://blog.csdn.net/m0_74014525 关注博主&#xff0c;后期持续更新系列文章 文章末尾有源码 *****感谢观看&#xff0c;希望对你有所帮助***** 文章目录 前言一、顺序表1. 顺序表是什么2. 优缺点 二、概念及结构…

【Midjourney电商与平面设计实战】创作效率提升300%

不得不说&#xff0c;最近智能AI的话题火爆圈内外啦。这不&#xff0c;战火已经从IT行业燃烧到设计行业里了。 刚研究完ChatGPT&#xff0c;现在又出来一个AI作图Midjourney。 其视觉效果令不少网友感叹&#xff1a;“AI已经不逊于人类画师了!” 现如今&#xff0c;在AIGC 热…

ubuntu18.04复现yolo v8之CUDA与pytorch版本问题以及多CUDA版本安装及切换

最近在复现yolo v8的程序&#xff0c;特记录一下过程 环境&#xff1a;ubuntu18.04ros melodic 小知识&#xff1a;GPU并行计算能力高于CPU—B站UP主说的 Ubuntu可以安装多个版本的CUDA。如果某个程序的Pyorch需要不同版本的CUDA&#xff0c;不必删除之前的CUDA&#xff0c;…

【AndroidStudio】java.nio.charset.MalformedInputException: Input length = 1

java.nio.charset.MalformedInputException: Input length 1 可以参考这个文章处理下编码格式&#xff1a;https://blog.csdn.net/twotwo22222/article/details/124605029java.nio.charset.MalformedInputException: Input length 1是因为你的配置文件里面有中文或者是你的编…

Ansible 自动化安装软件

例子如下&#xff1a; 创建一个名为/ansible/package.yml 的 playbook : 将 php 和 mariadb 软件包安装到 dev、test 和 prod 主机组中的主机上 将 RPM Development Tools 软件包组安装到 dev 主机组中的主机上 将 dev 主机组中主机上的所有软件包更新为最新版本 --- - name:…

自定义滑动到底部触发指令,elementUI实现分页下拉框

在 main.js 中添加 // 自定义滑动到底部指令 Vue.directive(selectLoadMore, {bind(el, binding) {// 获取element-ui定义好的scroll盒子const SELECTWRAP_DOM el.querySelector(.el-select-dropdown .el-select-dropdown__wrap)SELECTWRAP_DOM.addEventListener(scroll, fun…

MyBatis动态语句且如何实现模糊查询及resultType与resultMap的区别---详细介绍

前言 前面我们学习了如何使用Mybatis实现简单的增删改查。今天我们来学习如何使用动态语句来根据不同的条件生成不同的SQL语句。这在实际开发中非常有用&#xff0c;因为通常查询条件是多样化的&#xff0c;需要根据实际情况来拼接SQL语句&#xff0c;那什么是MyBatis动态语句呢…

JW0818近电报警芯片

JW0818 市电感应报警电路适用于电业人员和电信行业施工人员的安全保护用品–近电预警器 报警电路。 特别注意芯片引脚6&#xff0c;输出信号是方波&#xff0c;而不是高低电平&#xff1b;在产品开发过程遇到这个坑。

Vue+Axios搭建二次元动态登录页面(mp4视频格式)

最近想做一个前端登录页面&#xff0c;背景好看的&#xff0c;格式中规中矩的&#xff0c;这么难&#xff1f;我自己创一个吧&#xff01; 效果图如下&#xff1a; 源码可以参考我的github&#xff0c;复制源码即可用&#xff1a;gym02/loginPage_Vue: 使用VueAxios搭建的动态…

DataLoader

机器学习的五个步骤&#xff1a; 数据模块——模型——损失函数——优化器——训练 在实际项目中&#xff0c;如果数据量很大&#xff0c;考虑到内存有限、I/O 速度等问题&#xff0c;在训练过程中不可能一次性的将所有数据全部加载到内存中&#xff0c;也不能只用一个进程去加…

PDF校对工具正式上线,为用户提供卓越的文档校对解决方案

为满足当下对数字化文档校对的精准需求&#xff0c;我们今日正式发布全新的PDF校对工具。经过深入的技术研发与细致的测试&#xff0c;该工具旨在为企业和个人用户带来一个高效且准确的PDF文档校对平台。 PDF校对工具的主要特性&#xff1a; 1.全面性校对&#xff1a;工具支持…

Unity血条制作

一、使用UGUI制作血条 我一般使用image制作血条&#xff0c;当然&#xff0c;也可以使用滑动组件Slider。image的具体操作步骤如下 普通血条 1、在Hierarchy面板中&#xff0c;创建两个image组件&#xff0c;将其中一个设置为另外一个的子节点 2、在Inspector面板中&#…

操作教程|通过1Panel开源Linux面板快速安装DataEase

DataEase开源数据可视化分析工具&#xff08;dataease.io&#xff09;的在线安装是通过在服务器命令行执行Linux命令来进行的。但是在实际的安装部署过程中&#xff0c;很多数据分析师或者业务人员经常会因为不熟悉Linux操作系统及命令行操作方式&#xff0c;在安装DataEase的过…

【学会动态规划】最长递增子序列的个数(28)

目录 动态规划怎么学&#xff1f; 1. 题目解析 2. 算法原理 1. 状态表示 2. 状态转移方程 3. 初始化 4. 填表顺序 5. 返回值 3. 代码编写 写在最后&#xff1a; 动态规划怎么学&#xff1f; 学习一个算法没有捷径&#xff0c;更何况是学习动态规划&#xff0c; 跟我…

axios 介绍

axios 介绍 axios 是一款基于 javascript xhr 进行封装的插件&#xff0c;自己通过 xhr 进行编写 ajax 请求&#xff0c;实现起来逻辑比较复杂&#xff0c;axios 封装后将复杂的逻辑写在插件的内部&#xff0c;我们用户只需要关心如何调用即可。对我们的开发带来了很大的便捷。…