344.反转字符串
题目链接/文章讲解/视频讲解:https://programmercarl.com/0344.%E5%8F%8D%E8%BD%AC%E5%AD%97%E7%AC%A6%E4%B8%B2.html
本题还是用双指针法还是比较简单的,这里就不多赘述,就直接看代码吧
public void reverseString(char[] s) {
int i=0;
int j = s.length-1;
while(i<j){
char c = s[i];
s[i] = s[j];
s[j] = c;
j--;
i++;
}
}
541.反转字符串Ⅱ
题目链接/文章讲解/视频讲解:https://programmercarl.com/0541.%E5%8F%8D%E8%BD%AC%E5%AD%97%E7%AC%A6%E4%B8%B2II.html
分析题目:首先要明白题意,举一个简单的例子
// 这是字符串s,假设K=3,2K=6
String s = "asdfghjklzxcvq";
// 每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符
// 2k个字符表示:asdfgh , jklzxc , vq :将字符串划分成3段
// 反转这2k个字符中的前K个就是 反转asdfgh中的asd,最后就等于 dsafgh
// 最后的vq,因为最后字符长度不足k个,所以要全部反装,就等于qv
// 如果说最后剩的字符串为vqwe,满足k个,但是不满足2k,那么就还是只反转前k个,就是wqve
// 那么这个字符串最后的结果就是:dsafgh lkjzxc qv(wqve)
思路:明白题意后再来做题,思路就比较明确了,同样是使用双指针,一个指针指向每段的开头,一个指向每段的第K个位置(注意结尾这个指针,要么包括这个字符,要么不包括,做题一些边界条件一定要注意这一点)
public String reverseStr(String s, int k) {
char[] arr = s.toCharArray();
// 因为计数是没至2k个开始,所以步长直接设置成i+=2*k
for(int i=0; i<s.length(); i+=2*k){
// 每次反转前K个字符的起始坐标
int start = i;
// 计算结尾坐标:注意-1是表示当前字符也要反转,这里不-1循环内部就必须要-1
// 这里包括了最后几个字符的条件判断
int end = Math.min(s.length()-1,start+k-1);
// 反转操作
while(start < end){
char c = arr[start];
arr[start] = arr[end];
arr[end] = c;
start++;
end--;
}
}
return new String(arr);
}
卡玛网-54.替换数字
题目链接/文章讲解:https://programmercarl.com/kama54.%E6%9B%BF%E6%8D%A2%E6%95%B0%E5%AD%97.html
题目分析:将字符串中的数字替换为number,那么我们就得提前创建一个足够存储这些字符的数组
思路:这题依然是使用双指针法,首先创建一个扩容后的新数组,i指针指向新数组的末尾,j指针指向旧指针的末尾,然后判断如果nums[j]当前不是数字那么就把这个元素移动到nums[i],如果是数字就从后往前填充number。
- 为什么是从后往前填充,如果我们从前往后填充数组,那么数字后面的元素我们就要不断后移,从后往前只需要覆盖元素即可
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String s = scanner.next();
System.out.println(replaceNumber(s));
scanner.close();
}
public static String replaceNumber(String s) {
// 统计数字的数量,用来扩容数组
int count = 0;
int sOldSize = s.length();
for(int i=0; i<sOldSize; i++){
// 判断字符串中的字符是否为数字
if(Character.isDigit(s.charAt(i))){
count++;
}
}
// 创建一个新数组,扩大容量(算上数字的一位,一共6位)
char[] newArr = new char[s.length()+5*count];
System.arraycopy(s.toCharArray(),0,newArr,0,sOldSize);
int sNewSize = newArr.length;
// i:为新数组的末尾,j:为旧数组的末尾
for(int i=sNewSize-1,j=sOldSize-1 ; j<i; i--,j--){
// 判断当前的字符是否 不是 数字
if(!Character.isDigit(newArr[j])){
// 当前字符不是数字,就将当前字符移动到末尾
newArr[i] = newArr[j];
}else{
newArr[i] = 'r';
newArr[i-1] = 'e';
newArr[i-2] = 'b';
newArr[i-3] = 'm';
newArr[i-4] = 'u';
newArr[i-5] = 'n';
i-=5;
}
}
return new String(newArr);
};
}