第四章 字符串part01今日任务 ● 344.反转字符串
● 541. 反转字符串II
● 卡码网:54.替换数字
● 151.翻转字符串里的单词
● 卡码网:55.右旋转字符串详细布置 344.反转字符串 建议: 本题是字符串基础题目,就是考察 reverse 函数的实现,同时也明确一下 平时刷题什么时候用 库函数,什么时候 不用库函数 题目链接/文章讲解/视频讲解:https://programmercarl.com/0344.%E5%8F%8D%E8%BD%AC%E5%AD%97%E7%AC%A6%E4%B8%B2.html 541. 反转字符串II建议:本题又进阶了,自己先去独立做一做,然后在看题解,对代码技巧会有很深的体会。 题目链接/文章讲解/视频讲解:https://programmercarl.com/0541.%E5%8F%8D%E8%BD%AC%E5%AD%97%E7%AC%A6%E4%B8%B2II.html 卡码网:54.替换数字 建议:对于线性数据结构,填充或者删除,后序处理会高效的多。好好体会一下。
题目链接/文章讲解:https://programmercarl.com/kama54.%E6%9B%BF%E6%8D%A2%E6%95%B0%E5%AD%97.html151.翻转字符串里的单词 建议:这道题目基本把 刚刚做过的字符串操作 都覆盖了,不过就算知道解题思路,本题代码并不容易写,要多练一练。 题目链接/文章讲解/视频讲解:https://programmercarl.com/0151.%E7%BF%BB%E8%BD%AC%E5%AD%97%E7%AC%A6%E4%B8%B2%E9%87%8C%E7%9A%84%E5%8D%95%E8%AF%8D.html 卡码网:55.右旋转字符串 建议:题解中的解法如果没接触过的话,应该会想不到
day08
反转字符串1
双指针
class Solution {public void reverseString(char[] s) {//头尾双指针int len = s.length;for( int i = 0, j = len-1; i < len/2; i++, j--){swap(s,i,j);//注意要把s传进去,这样才能实际操作s里的元素}}public void swap( char[] s, int i, int j ){char temp = s[i];s[i] = s[j];s[j] = temp;}}
反转字符串2
重点在for循环
class Solution {public String reverseStr(String s, int k) {//字符串转化为数组char[] ch = s.toCharArray();//每次翻转的起点都会加2kfor( int i = 0; i < ch.length; i +=2*k){//如果从i开始够k个//判断一下加不加等号:比如k=3,length=3,相等也可操作//2*k不是2kif( i + k <= ch.length){reverse(ch, i, i+k-1);continue;}//如果不够k个reverse(ch, i, ch.length - 1);}return new String(ch);//数组转成字符串}public void reverse( char[] ch, int i, int j){while( i < j){//等于的时候没必要翻转char temp = ch[i];ch[i] = ch[j];ch[j] = temp;i++;j--;}}}
替换数字
例如:a1bvf变成anumberbvf
import java.util.Scanner;public class Main{public static String replaceNumber(String s){int count = 0; int oldSize = s.length();for(int i = 0; i<oldSize; i++){if(Character.isDigit( s.charAt(i) )) count++;}int newSize = oldSize + 5 * count;char[] news = new char[newSize];System.arraycopy(s.toCharArray(),0,news,0,oldSize);//System.arraycopy不是System.arrayCopyfor(int i = oldSize - 1, j = newSize - 1; i>=0; i--){//-1不是-iif(Character.isDigit(news[i])){news[j - 5] = 'n'; news[j - 4] = 'u'; news[j - 3] = 'm'; news[j - 2] = 'b'; news[j - 1] = 'e'; news[j] = 'r'; j -= 6;}else{news[j] = news[i];j--;}}return new String(news);//news是char[]不是字符串,需要用String(char[]转换成字符串}public static void main(String[] args){Scanner sc = new Scanner(System.in);String s = sc.next();System.out.println(replaceNumber(s));sc.close();} }
翻转字符串里的单词
class Solution {//1.双指针移除多余空格 2.翻转字符串 3.翻转单词public String reverseWords(String s) {char[] chars = s.toCharArray();chars = removeExtreSpace(chars);reverse(chars, 0, chars.length - 1);reverseEachWorld(chars);return new String(chars);}//1.移除多余空格,快指针只保留非空字符,慢指针判断接收快指针指向字符的时候要不要加一个空格public char[] removeExtreSpace(char[] chars){int slow = 0;int fast = 0;int len = chars.length;for( ; fast < len; fast++){//移除空格直接遍历fastif( chars[fast] == ' '){//遇到空格啥都不用管直接fast++,非空格就继续操作,其实if可以直接写非空格的情况continue;}else{if( slow != 0){//如果slow在最开始,不用加空格;否则slow接受之前先加空格,优化逻辑先写要加空格的情况chars[slow++] = ' ';}while( fast < len && chars[fast] != ' '){//遍历一个单词,在for里面用while;另外注意fast<len的边界条件要写在前面,不然会报越界异常chars[slow++] = chars[fast++];}}}char[] newchars = new char[slow];System.arraycopy(chars, 0, newchars, 0, slow);//前面正好slow自增了,传下标[0,solw)刚刚好return newchars;}//2.翻转字符串public char[] reverse(char[] chars, int i, int j){for( ; i < j; i++, j--){char temp = chars[i];chars[i] = chars[j];chars[j] = temp;} return chars;}//3.翻转单词public char[] reverseEachWorld( char[] chars ){int start = 0;int end = 0;for( ;end <= chars.length; end++){if( end == chars.length || chars[end] == ' ' ){//fast<len的边界条件要写在前面,不然会报越界异常reverse(chars, start, end - 1);start = end + 1;}}return chars;}}
右旋字符串
一个套路,整体反转+局部翻转即可;先局部反转再整体反转也行
public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);int n = Integer.parseInt(in.nextLine());String s = in.nextLine();int len = s.length(); char[] chars = s.toCharArray();reverseString(chars, 0, len - 1); //整体反转reverseString(chars, 0, n - 1); //局部反转reverseString(chars, n, len - 1); System.out.println(chars);}
注:感谢大佬分享
代码随想录-算法训练营day08【字符串01:反转字符串、替换数字、反转字符串里的单词、右旋转字符串】_代码随想录替换数字-CSDN博客