算法训练营day08(字符串01:反转字符串,反转字符串2,替换数字,反转字符串里的单词,右旋转字符串)

bash 复制代码
第四章 字符串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.html
 
 
 151.翻转字符串里的单词 
 
建议:这道题目基本把 刚刚做过的字符串操作 都覆盖了,不过就算知道解题思路,本题代码并不容易写,要多练一练。 
 
题目链接/文章讲解/视频讲解: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();
         //每次翻转的起点都会加2k
         for( int i = 0; i < ch.length; i +=2*k){
             //如果从i开始够k个
             //判断一下加不加等号:比如k=3,length=3,相等也可操作
             //2*k不是2k
             if( 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.arrayCopy
         for(int i = oldSize - 1, j = newSize - 1; i>=0; i--){
           //-1不是-i
             if(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++){//移除空格直接遍历fast
             if( 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博客

相关推荐
DokiDoki之父8 小时前
MyBatis—增删查改操作
java·spring boot·mybatis
兩尛8 小时前
Spring面试
java·spring·面试
Java中文社群8 小时前
服务器被攻击!原因竟然是他?真没想到...
java·后端
Full Stack Developme9 小时前
java.nio 包详解
java·python·nio
零千叶9 小时前
【面试】Java JVM 调优面试手册
java·开发语言·jvm
白云千载尽9 小时前
leetcode 912.排序数组
算法·leetcode·职场和发展
哆啦刘小洋9 小时前
Tips:预封装约束的状态定义
算法
代码充电宝9 小时前
LeetCode 算法题【简单】290. 单词规律
java·算法·leetcode·职场和发展·哈希表
li3714908909 小时前
nginx报400bad request 请求头过大异常处理
java·运维·nginx
摇滚侠9 小时前
Spring Boot 项目, idea 控制台日志设置彩色
java·spring boot·intellij-idea