代码随想录算法训练营Day8|541. 反转字符串II、替换数字、151.翻转字符串里的单词、卡码网:55.右旋转字符串

541. 反转字符串II

1.这道题刚开始把题意理解错了,以为对于任意长度的字符串都只反转[0,k-1]以及[2k,3k-1]区间的值。
2.但实际上是要把一个字符串分成若干长度为2k的小区间,反转前[0,k-1]的字符串,[k,2k-1]保持不变;
3.如果有一个区间字符串字符个数小于k,则全部反转。
4.双指针法实现反转比用索引更方便

class Solution {public String reverseStr(String s, int k) {StringBuilder res = new StringBuilder(s);for(int i=0;i<=s.length()-1;i+=2*k){//每2k长度的区间操作一次if(s.length() >= i+k) reverse(res,i,i+k-1);//如果s字符串长度大于等于i+k,[i,i+k-1]区间反转,[i+k,i+2k-1]不变else reverse(res,i,s.length()-1);//如果s字符串长度小于i+k,在[i,s.length()-1]区间上全部反转}return  res.toString();}public StringBuilder reverse(StringBuilder s,int startIndex,int endIndex){//双指针法实现反转比用索引更方便int left = startIndex;int right = endIndex;while(left<right){char temp = s.charAt(left);s.setCharAt(left,s.charAt(right));s.setCharAt(right,temp);left++;right--;}return s;}
}

import java.util.*;
class Main{
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
String target = scanner.nextLine();
System.out.print(method(target));
}
public static String method(String str){
StringBuilder sb = new StringBuilder();
for(int i=0;i<str.length();i++){
if(Character.isDigit(str.charAt(i))) sb.append(“number”);
else sb.append(str.charAt(i));
}
return sb.toString();
}
}

替换数字

这道题是ACM格式的,趁这个机会练习一下。要注意以下几点:
1.类名必须为Main,同时要有主函数。
2.要有输入输出,输出要打印
3.需要自己导入必要的包

补充知识点:
Character.isDigit()判断字符是否为数字

import java.util.*;
class Main{public static void main(String[] args){Scanner scanner = new Scanner(System.in);String target = scanner.nextLine();System.out.print(method(target));}public static String method(String str){StringBuilder sb = new StringBuilder();for(int i=0;i<str.length();i++){if(Character.isDigit(str.charAt(i))) sb.append("number");else sb.append(str.charAt(i));}return sb.toString();}
}

151.翻转字符串里的单词

方法一:自己想的方法,思路比较简单,但是调试了好久,贴在这里梳理一下思路。

class Solution {public String reverseWords(String s) {ArrayList<StringBuilder> list = new ArrayList<StringBuilder>();//存储遍历出来的一个个的无空格的单词StringBuilder sb = new StringBuilder(s);//先将String转为StringBuilder类型,便于操作StringBuilder res = new StringBuilder();//存储最终返回的结果int i = 0;//初始化指针while(sb.charAt(i) == ' ') i++;//将指针移动到有单词的位置上while(i < s.length()){//遍历sStringBuilder sbOne = new StringBuilder();//存储一个单词的StringBuilderwhile(s.charAt(i) != ' '){//不是空格的时候sbOne.append(s.charAt(i));//字符持续加入sbOne,直到遇到空格i++;if(i >= s.length()) break;//大于等于s.length(),也结束循环}list.add(sbOne);//此时指针i在空格上或者在最后一个字符的下一位,先保存sbOneif(i >= s.length()) break;//如果在最后一个字符的下一位,直接结束循环while(s.charAt(i) == ' '){//如果是空格就持续向下移动,直到遇到单词i++;if(i >= s.length()) break;//大于等于s.length(),也结束循环}}//此时list已经按序存储了所有满足条件的单词for(int j=list.size()-1;j >= 1;j--){res.append(list.get(j) + " ");}//除了第一个单词,其他都是一个单词一个空格地加入resres.append(list.get(0));//第一个单词直接加入,没有空格return res.toString();}
}

方法二:
卡哥的方法,先整体反转,再去除多余的空格,最后再对每一个单词反转。卡哥要求空间复杂度为O(1),那方法一就不符合要求了。

class Solution {public String reverseWords(String s) {int length = s.length();StringBuilder sb = new StringBuilder(s);reverse(sb,0,length-1);removeExtraSpace(sb);reverseOneWord(sb);return sb.toString();}public static void reverse(StringBuilder s,int startIndex,int endIndex){//双指针法实现反转int left = startIndex;int right = endIndex;while(left < right){char temp = s.charAt(left);s.setCharAt(left,s.charAt(right));s.setCharAt(right,temp);left++;right--;}}public static void reverseOneWord(StringBuilder s){//单个单词反转,对于除最后一个单词之外的单词//快指针下一个为空说明此时fast处于单词尾部,[slow,fast]之间的字符反转//slow变为fast+2,因为要跳过空格//最后一个单词直接[slow,s.length()-1]反转int slow = 0;for(int fast = 0;fast < s.length()-1;fast++){if(s.charAt(fast+1) != ' ') continue;else{reverse(s,slow,fast);slow = fast+2;}}reverse(s,slow,s.length()-1);}public static void removeExtraSpace(StringBuilder s){int slow = 0;boolean need=false;for(int fast = 0; fast < s.length();fast++){if(s.charAt(fast) != ' '){s.setCharAt(slow++,s.charAt(fast));//当快指针遇到了单词的第一个字母,说明slow指针放置完这个单词之后还要再放一个' 'need = true;}else if(need){//当遇到了空格(一个单词遍历结束)并且need为true,将slow指针指向的位置置为' 's.setCharAt(slow++,' ');   need = false;}}//但是如果原始字符串本身以空格结尾,倒数第一个单词遍历完之后need还是true的,因此新字符串还会添一个' ',这个时候应该长度置为slow-1if(s.charAt(s.length()-1) == ' ') s.setLength(slow-1);//如果原始字符串本身不以空格结尾,新字符串不会添' ',直接s.setLength(slow);else s.setLength(slow);}
}

方法三:
之前写的一个方法,用字符数组做的,时间复杂度和空间复杂度都很低。
这里的反转单个单词的方法非常棒:

    public void keyReverse(char[] chars){//start索引是随着end索引移动而移动的int start = 0;//这里end <= chars.length,end最大可以到chars.length,对应的是reverse(chars,start,end-1);for(int end = 0;end <= chars.length;end++){if(end == chars.length || chars[end] == ' '){reverse(chars,start,end-1);start = end+1;}}}
class Solution {public String reverseWords(String s) {char[] chars = s.toCharArray();char[] charsNew = trim(chars,chars.length);reverse(charsNew,0,charsNew.length-1);keyReverse(charsNew);return String.valueOf(charsNew);}public void keyReverse(char[] chars){//start索引是随着end索引移动而移动的int start = 0;//这里end <= chars.length,end最大可以到chars.length,对应的是reverse(chars,start,end-1);for(int end = 0;end <= chars.length;end++){if(end == chars.length || chars[end] == ' '){reverse(chars,start,end-1);start = end+1;}}}//该方法用于反转指定索引的字符串public void reverse(char[] chars,int start,int end){while(start < end){char temp = chars[start];chars[start] = chars[end];chars[end] = temp;start++;end--;}}public char[] trim(char[] chars,int length){//该方法用于去除字符串两头的空格以及单词之间多余的空格int slow = 0;for(int fast = 0;fast< length;fast++){if(chars[fast] != ' '){//遇到非空说明slow后面要加空格了if(slow != 0) chars[slow++] = ' ';//直到找到下一个单词首字母(非空)while(fast < chars.length && chars[fast] != ' '){chars[slow++] = chars[fast++];}}}//创建一个用于存储信数组的newChars,可以将多余部分去除char[] newChars = new char[slow];//chars为复制源,起始索引,目标数组,起始索引,要复制的元素数量System.arraycopy(chars, 0, newChars, 0, slow); return newChars;}
}

卡码网:55.右旋转字符串

这道题目很简单,但是解决了我长久以来关于ACM模式的一个困惑:连续用scanner向系统键入两个量的时候,会报错。
因为:如下面代码所示, int num = scanner.nextInt();输入一个整数之后还要键入一个回车,这个回车会被当成紧接着要输入的scanner.nextLine();导致在执行下面代码中出错。因此需要键入一个scanner.nextLine();消耗掉回车。
scanner.nextLine(); // 消耗掉nextInt后的换行符

import java.util.*;
class Main{public static void main(String[] args){Scanner scanner = new Scanner(System.in);int num = scanner.nextInt();scanner.nextLine();//消耗掉回车String str = scanner.nextLine();int len = str.length();StringBuilder sb = new StringBuilder();for(int i = len-num;i < len;i++){sb.append(str.charAt(i));}for(int i = 0;i<len-num;i++){sb.append(str.charAt(i));}System.out.print(sb.toString());}
}

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

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

相关文章

2024年东北师范CCPC

文章目录 A.Paper WateringB.nIM gAMEE.Checksum A.Paper Watering 思路&#xff1a;题目说有平方和开方两种操作&#xff0c;如果这个数是平方数&#xff0c;那么它开方之后就只能开方&#xff0c;如果平方的话就重复了&#xff0c;反之就有开方和平方两种操作。 代码如下 //…

为了方便看公众号文章,我搭建了个博客,在线看公众号所有历史文章,想看哪天的文章一秒就能找到

公众号没有个网页版的文章列表&#xff0c;只能在电脑和手机客户端看&#xff0c;想看之前的历史文章只能一直往下拉&#xff0c;想找某篇文章非常费劲。 为了方便看公众号文章&#xff0c;我搭建了个博客&#xff0c;博客地址https://sushengbuhuo.github.io/blog &#xf…

通过 SFP 接口实现千兆光纤以太网通信1

基于米联客ARTIX-7 系列开发板及其开发手册。 总体实现框图如下&#xff1a; SFP 接口 SFP 信号定义如下图所示。 Tri Mode Ethernet MAC 设置 由于使用千兆通讯&#xff0c;因此将速率设为 1Gbps。如下图所示。 首先&#xff0c;由于该 IP 需要与 IP 核 1G/2.5G Ethernet …

基于IoTDB 平台的学习和研究

Apache IoTDB&#xff08;物联网数据库&#xff09;是一个针对物联网领域的高性能原生数据库&#xff0c;适用于数据管理和分析&#xff0c;并可在边缘计算和云端部署。由于它轻量级的架构、高性能和丰富的功能集&#xff0c;以及与Apache Hadoop、Spark和Flink的深度集成&…

【面试】生成class文件的编译器有哪些?

目录 1. 说明2. javac3. IDE(集成开发环境)中的编译器3.1 Eclipse编译器3.2 IntelliJ IDEA编译器 1. 说明 1.javac和IDE中的编译器是最常用的和主要的。2.这些编译器都能够将Java源代码编译为可在JVM上执行的字节码文件&#xff0c;是实现Java跨平台特性的关键。3.选择编译器时…

数据管理知识体系必知的14张语境关系图

近期对数据管理知识体系中的语境关系图进行了整体学习梳理,总共有14张图,具体如下,供大家参考。应该说语境关系图和环境因素六边形图是各有侧重、互为补充关系。语境关系图是环境因素六边形图的细化,描述了每个知识领域中的细节,相当于数据管理的微观视角, 包括与人员、 …

kali中切换python版本

kali中切换python版本 在日常使用的过程中&#xff0c;可以通过一些工具来做打靶环境&#xff0c;或者工具的启动&#xff0c;都和python关联&#xff0c;而有时存在工具安装&#xff0c;或者运行的时候出现报错&#xff0c;这时候极大可能是因为我们本地的kali中python的版本不…

Android Studio | 小白如何运行别人的安卓项目

目录 Step1&#xff1a;正确地打开项目 Step2&#xff1a;AS 同步时报错 Step3&#xff1a;同步完成后启动 Step4&#xff1a;启动成功 说明&#xff1a;本文简称 Android Studio 为 AS Step1&#xff1a;正确地打开项目 重点&#xff1a;确认好项目的根目录是哪个目录&am…

进程与线程(三)

进程与线程&#xff08;三&#xff09; 进程间通信传统间的进程间通信机制无名管道无名管道的特征无名管道的创建父子进程通信测试管道的大小管道读写易出现的问题 有名管道创建有名管道有名管道的写端代码有名管道的读端代码 信号信号的特征产生信号硬件来源软件来源发送信号的…

Linux chmod 命令

Linux chmod 命令 在 Linux 操作系统中&#xff0c;chmod 命令是非常重要的。它可以用于修改文件和目录的访问权限&#xff0c;以及控制用户对系统资源的访问。在这篇博客中&#xff0c;我们将深入探讨 chmod 命令的使用方法&#xff0c;以及如何使用它来管理文件和目录的访问…

什么是主码,什么是候选码,主码的候选码的区别是什么

目录 一、候选码 (Candidate Key) 1.定义 2.特点 二、主码 (Primary Key) 1.定义 2.特点 三、关系和区别 1.关系 2.区别 一、候选码 (Candidate Key) 1.定义 候选码是能够唯一标识数据库表中每一条记录的属性集合。一个表可以有一个或多个候选码。 2.特点 每个候选…

【U-Boot 源码深度解析】000 - 文章链接汇总

【U-Boot 源码深度解析】000 - 文章链接汇总 下载链接 https://ftp.denx.de/pub/u-boot/ 《【U-Boot 源码深度解析】001 - Ubuntu 24.04 虚拟机 及 基础环境搭建》

ORACLE RAC的一些基本理论知识

一 . Oracle RAC 的发展历程 1. Oracle Parallel Server (OPS) 早期阶段&#xff1a;Oracle 6 和 7 Oracle Parallel Server&#xff08;OPS&#xff09;是 Oracle RAC 的前身。 通过多个实例并行访问同一个数据库来提高性能。 共享磁盘架构&#xff0c;利用分布式锁管理&am…

JZ2440笔记:Nor FLASH驱动程序

(1)测试原有的驱动&#xff1a; make menuconfig修改physmap-flash驱动配置&#xff1a;起始0&#xff0c;大小0x100000&#xff0c;位宽2&#xff0c;make modules后拷贝过去测试&#xff1a; # insmod physmap.ko physmap platform flash device: 01000000 at 00000000 phy…

C#面:解释什么是viewstate,能否禁用?是否所用控件都可以禁用

在C#中&#xff0c;ViewState是 ASP.NET Web Forms中的一个重要概念。它用于在Web应用程序中跨页面请求之间保存和恢复页面的状态数据。ViewState的主要目的是在页面回发&#xff08;postback&#xff09;期间保持页面上的控件状态&#xff0c;以便在页面重新加载后能够正确地还…

addEventListener()方法中的几个参数,以及作用

addEventListener() 方法是 JavaScript 中用于处理指定元素的指定事件的函数。它有三个参数&#xff1a; type&#xff08;必需&#xff09;&#xff1a;一个字符串&#xff0c;指定要监听的事件名。 listener&#xff08;必需&#xff09;&#xff1a;一个实现了 EventListen…

【第1章】SpringBoot实战篇之注册接口

文章目录 前言一、代码部分1. User2.UserMapper13. UserSerivce4. UserController15. Result 二、测试1.注册2.再次注册 总结 前言 下面介绍用户注册接口。 一、代码部分 1. User package org.example.springboot3.bigevent.entity;import com.baomidou.mybatisplus.annotat…

开发板uboot与virtualbox虚拟机、windows11网络互通

环境&#xff1a;virtualbox中ubuntu22.04.4&#xff0c;开发板通过网线再经过拓展坞usb网卡跟windows11连接。连接如下&#xff1a; 1、关闭windows防火墙(重要) 2、先在VirtualBox的工具选项创建两个网络【仅主机(Host-Only)网络】和【NAT网络】 仅主机(Host-Only)网络的ip:…

Linux下Qt Creator无法输入中文(已解决)

1. 首先确保安装了搜狗输入法&#xff0c;且能正常运行。 2.克隆源码到本地。 git clone https://gitcode.com/fcitx/fcitx-qt5.git 3.检查Qt Creator版本&#xff0c;如下图所示&#xff0c;为基于Qt6的。 4. 进入源码目录&#xff0c;建立build文件夹&#xff0c;修改CMak…

并发任务的进化之旅

An evolutionary journey of multitasking 多重任务的进化之旅 In the beginning, computers had one CPU that executed a set of instructions written by a programmer one by one. No operating system (OS), no scheduling, no threads, no multitasking. This was how …