第四章 字符串part01
今日任务
● 344.反转字符串
● 541. 反转字符串II
● 卡码网:54.替换数字
详细布置
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
344.反转字符串
题目链接
解题思路
头尾指针俩俩交换
code
public void reverseString(char[] s) {
int start=0;
int end=s.length-1;
while(start<end){
char temp=s[start];
s[start]=s[end];
s[end]=temp;
start++;
end--;
}
}
541. 反转字符串II
题目链接
解题思路
根据题目条件编码
抽象一个头尾双指针交换方法
code
public String reverseStr(String s, int k) {
char[] sc=s.toCharArray();
int startIndex=0;
int kb=2;
int length=sc.length;
for(int i=0;i<sc.length;i++){
if(i+1==kb*k){
swap(sc,startIndex,startIndex+(i-startIndex)/2);
startIndex=i+1;
kb+=2;
}else if(i+1==length){
int surplus=i-startIndex+1;
if(surplus<k){
swap(sc,startIndex,length-1);
}else if(surplus>=k&&surplus<2*k){
swap(sc,startIndex,startIndex+k-1);
}
}
}
return new String(sc);
}
public void swap(char[] s,int start,int end){
while(start<end){
char temp= s[start];
s[start]=s[end];
s[end]=temp;
start++;
end--;
}
}
卡码网:54.替换数字
题目链接
解题思路
从后往前开始构建字符串
新指针和旧指针
遍历旧指针
code
import java.util.Scanner;
public class Main {
public static String replaceNumber(String s) {
int count = 0; // 统计数字的个数
int sOldSize = s.length();
for (int i = 0; i < s.length(); i++) {
if(Character.isDigit(s.charAt(i))){
count++;
}
}
// 扩充字符串s的大小,也就是每个空格替换成"number"之后的大小
char[] newS = new char[s.length() + count * 5];
int sNewSize = newS.length;
// 将旧字符串的内容填入新数组
System.arraycopy(s.toCharArray(), 0, newS, 0, sOldSize);
// 从后先前将空格替换为"number"
for (int i = sNewSize - 1, j = sOldSize - 1; j < i; j--, i--) {
if (!Character.isDigit(newS[j])) {
newS[i] = newS[j];
} else {
newS[i] = 'r';
newS[i - 1] = 'e';
newS[i - 2] = 'b';
newS[i - 3] = 'm';
newS[i - 4] = 'u';
newS[i - 5] = 'n';
i -= 5;
}
}
return new String(newS);
};
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String s = scanner.next();
System.out.println(replaceNumber(s));
scanner.close();
}
}
// 为了还原题目本意,先把原数组复制到扩展长度后的新数组,然后不再使用原数组、原地对新数组进行操作。
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.next();
int len = s.length();
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) >= 0 && s.charAt(i) <= '9') {
len += 5;
}
}
char[] ret = new char[len];
for (int i = 0; i < s.length(); i++) {
ret[i] = s.charAt(i);
}
for (int i = s.length() - 1, j = len - 1; i >= 0; i--) {
if ('0' <= ret[i] && ret[i] <= '9') {
ret[j--] = 'r';
ret[j--] = 'e';
ret[j--] = 'b';
ret[j--] = 'm';
ret[j--] = 'u';
ret[j--] = 'n';
} else {
ret[j--] = ret[i];
}
}
System.out.println(ret);
}
}