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博客