344.反转字符串
思路:本题的运用双指针的方式,掉换两个头尾两个元素,然后指针收缩再继续掉换,这里无论字符串大小是否为奇偶,都是可以判断出来的
代码:
class Solution {
public void reverseString(char[] s) {
int left=0;
int right=s.length-1;
while(left<right){
char temp=s[left];
s[left]=s[right];
s[right]=temp;
right--;
left++;
}
}
}
541. 反转字符串II
思路:从题目可以知道,每2k个字符中反转前k个字符,所以每次循环得一次取到2k个字符,然后开始下标为当前i值,而末尾下标就是取:字符串最大长度和从start开始的第k个长度两者的最小值。然后循环交换值,
代码:
class Solution {
public String reverseStr(String s, int k) {
char[] ch=s.toCharArray();
for(int i=0;i<ch.length;i+=2*k){
int start=i;
int end=Math.min(ch.length-1,start+k-1);
while(start<end){
char temp=ch[start];
ch[start]=ch[end];
ch[end]=temp;
end--;
start++;
}
}
return new String(ch);
}
}
54.替换数字
思路:判断字符串s中是否有数值出现,如果有数值就len+5(这里加5是因为本身字符串的数值占一个位置,而number是六个位置,最终加了五个位置上去),这里len最终存储的是加入number后的长度。然后设置要给res数组,存储最终加入number后的字符串;这里我们是用从后往前的方式加入元素,大大减少了工作量。先把原来字符串s中的元素加入到数组res中,然后循环,设置i和j,i指向旧数组的末尾位置,j指向的是新数组的位置,判断当前位置是否是数值,如果是,则新数组位置的j--,并存入number元素中的r字符,以此类推;如果不是数值,就直接把该位置的的i赋值给当前j所在的位置,然后i--,这里j是在数组中实现了j--,故在for循环上不显示。最后打印res即可
代码:
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[] res = new char[len];
for(int i = 0;i < s.length();i++){
res[i] = s.charAt(i);
}
for(int i = s.length()-1,j = len-1;i >= 0;i--){
if('0' <= res[i] && res[i] <= '9'){
res[j--] = 'r';
res[j--] = 'e';
res[j--] = 'b';
res[j--] = 'm';
res[j--] = 'u';
res[j--] = 'n';
}else{
res[j--] = res[i];
}
}
System.out.println(res);
}
}