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

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

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.mzph.cn/news/49635.shtml

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

相关文章

Blazor 依赖注入妙用:巧设回调

文章目录 前言依赖注入特性需求解决方案示意图 前言 依赖注入我之前写过一篇文章&#xff0c;没看过的可以看看这个。 C# Blazor 学习笔记(10):依赖注入 依赖注入特性 只能Razor组件中注入所有Razor组件在作用域注入的都是同一个依赖。作用域可以看看我之前的文章。 需求 …

【实例分割】(一)Mask R-CNN详细介绍带python代码

目录 1.&#x1f340;&#x1f340;实例分割定义 2.&#x1f340;&#x1f340;Mask R-CNN 3.&#x1f340;&#x1f340;经典的实例分割算法 4.&#x1f340;&#x1f340;Mask R-CNN python代码 整理不易&#xff0c;欢迎一键三连&#xff01;&#xff01;&#xff01;…

C++ vector

前言&#xff1a; vector的部分源码&#xff1a; &#xff08;做过删除&#xff0c;留下关键信息&#xff09; vector的使用 构造函数&#xff1a; 1 无参构造 vector<int> v1; 2 构造并初始化n个val vector<int> v2(5,1);3 拷贝构造 vector<int> v3…

4-4 Representing text Exercise

本文所用资料下载 一. Representing text Let’s load Jane Austen’s Pride and Prejudice. We first split our text into a list of lines and pick an arbitrary line to focus on: with open(D:jane-austen/1342-0.txt, encodingutf8) as f:text f.read() lines text.…

继承(C++)

继承 一、初识继承概念“登场”语法格式 继承方式九种继承方式组合小结&#xff08;对九种组合解释&#xff09; 二、继承的特性赋值转换 一一 切片 / 切割作用域 一一 隐藏 / 重定义 三、派生类的默认成员函数派生类的默认成员函数1. 构造函数2. 拷贝构造3. 赋值运算符重载4. …

Centos7查看磁盘和CUP统计信息iostat命令

Centos7查看磁盘和CUP统计信息iostat命令 Centos7内存高|查看占用内存命令 docker实战(一):centos7 yum安装docker docker实战(二):基础命令篇 docker实战(三):docker网络模式(超详细) docker实战(四):docker架构原理 docker实战(五):docker镜像及仓库配置 docker实战(六…

Spring Clould 注册中心 - Eureka,Nacos

视频地址&#xff1a;微服务&#xff08;SpringCloudRabbitMQDockerRedis搜索分布式&#xff09; Eureka 微服务技术栈导学&#xff08;P1、P2&#xff09; 微服务涉及的的知识 认识微服务-服务架构演变&#xff08;P3、P4&#xff09; 总结&#xff1a; 认识微服务-微服务技…

9.Sentinel哨兵

1.Sentinel Sentinel&#xff08;哨兵&#xff09;是由阿里开源的一款流量控制和熔断降级框架&#xff0c;用于保护分布式系统中的应用免受流量涌入、超载和故障的影响。它可以作为微服务架构中的一部分&#xff0c;用于保护服务不被异常流量冲垮&#xff0c;从而提高系统的稳定…

多线程+隧道代理:提升爬虫速度

在进行大规模数据爬取时&#xff0c;爬虫速度往往是一个关键问题。本文将介绍一个提升爬虫速度的秘密武器&#xff1a;多线程隧道代理。通过合理地利用多线程技术和使用隧道代理&#xff0c;我们可以显著提高爬虫的效率和稳定性。本文将为你提供详细的解决方案和实际操作价值&a…

【数据库】详解数据库架构优化思路(两主架构、主从复制、冷热分离)

文章目录 1、为什么对数据库做优化2、双主架构双主架构的工作方式如下&#xff1a;双主架构的优势包括&#xff1a;但是一般不用这种架构&#xff0c;原因是&#xff1a; 3、主从复制主从复制的工作方式如下&#xff1a;主从复制的优势包括&#xff1a;主从复制的缺点 4、冷热分…

回归预测 | MATLAB实现NGO-SVM北方苍鹰算法优化支持向量机多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现NGO-SVM北方苍鹰算法优化支持向量机多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现NGO-SVM北方苍鹰算法优化支持向量机多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09;效果一览基…

机器学习知识点总结:什么是EM(最大期望值算法)

什么是EM(最大期望值算法) 在现实生活中&#xff0c;苹果百分百是苹果&#xff0c;梨百分白是梨。 生活中还有很多事物是概率分布&#xff0c;比如有多少人结了婚&#xff0c;又有多少人有工作&#xff0c; 如果我们想要调查人群中吸大麻者的比例呢&#xff1f;敏感问题很难得…

【VR】SteamVR2.0的示例场景在哪里

&#x1f4a6;本专栏是我关于VR开发的笔记 &#x1f236;本篇是——在哪里可以找到SteamVR2.0的示例场景 SteamVR2.0的示例场景在哪里 1. 逐步打开方式2. 快速打开方式 1. 逐步打开方式 Assets——SteamVR——InteractionSystem——Samples——>Interactions_Example 2. 快…

多维时序 | MATLAB实现KOA-CNN-BiGRU-Attention多变量时间序列预测

多维时序 | MATLAB实现KOA-CNN-BiGRU-Attention多变量时间序列预测 目录 多维时序 | MATLAB实现KOA-CNN-BiGRU-Attention多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 MATLAB实现KOA-CNN-BiGRU-Attention多变量时间序列预测&#xff0c;KOA-…

Postman项目实战一

项目简介&#xff1a;外卖任务委派系统 测试脚本&#xff1a; 登录&#xff0c;获取token创建任务&#xff0c;获取任务id根据id&#xff0c;修改任务根据id&#xff0c;查询任务根据id&#xff0c;删除任务根据id&#xff0c;验证任务已被删除 步骤&#xff1a; 1.创建Col…

工业生产全面感知!工业感知云来了

面向工业企业数字化转型需求&#xff0c;天翼物联基于感知云平台创新能力和5G工业物联数采能力&#xff0c;为客户提供工业感知云服务&#xff0c;包括工业泛协议接入、感知云工业超轻数采平台、工业感知数据治理、工业数据看板四大服务&#xff0c;构建工业感知神经系统新型数…

C++(Qt)软件调试---gdb调试入门用法(12)

gdb调试—入门用法&#xff08;1&#xff09; 文章目录 gdb调试---入门用法&#xff08;1&#xff09;1、前言1.1 什么是GDB1.2 为什么要学习GDB1.3 主要内容1.4 GDB资料 2、C/C开发调试环境准备3、gdb启动调试1.1 启动调试并传入参数1.2 附加到进程1.3 过程执行1.4 退出调试 4…

计算机竞赛 卷积神经网络手写字符识别 - 深度学习

文章目录 0 前言1 简介2 LeNet-5 模型的介绍2.1 结构解析2.2 C1层2.3 S2层S2层和C3层连接 2.4 F6与C5层 3 写数字识别算法模型的构建3.1 输入层设计3.2 激活函数的选取3.3 卷积层设计3.4 降采样层3.5 输出层设计 4 网络模型的总体结构5 部分实现代码6 在线手写识别7 最后 0 前言…

mysql------做主从复制,读写分离

1.为什么要做主从复制&#xff08;主从复制的作用&#xff09; 做数据的热备&#xff0c;作为后备数据库&#xff0c;主数据库服务器故障后&#xff0c;可切换到从数据库继续工作&#xff0c;避免数据丢失。 架构的扩展。业务量越来越大,I/O访问频率过高&#xff0c;单机无法满…

shell和Python 两种方法分别画 iostat的监控图

在服务器存储的测试中,经常需要看performance的性能曲线&#xff0c;这样最能直接观察HDD或者SSD的性能曲线。 如下这是一个针对HDD跑Fio读写的iostat监控log,下面介绍一下分别用shell 和Python3 写画iostat图的方法 1 shell脚本 环境:linux OS gnuplot工具 第一步 :解析iosta…