一.反转字符串
没啥好说的,就双指针法.
唯一要注意一下的就是别忘了s这个引用存的是传入数组的指针,所以在方法中动这个指针其在内存中就变了,在方法外面也就变了,所以返回值为void.
public static void reverseString(char[] s) {
int a = 0;
int b = s.length - 1;
if (s.length == 0){
return ;
}
while (a < b){
char temp = s[a];
s[a] = s[b];
s[b] = temp;
a ++;
b --;
}
}
二.反转字符串2
自己一点一点磨出来了,但是感觉思路不是那么清晰
public static String reverseStr(String s, int k) {
// 将String存到char[]里,String是不可变的
char[] chars = new char[s.length()];
for (int i = 0; i < s.length(); i++) {
chars[i] = s.charAt(i);
}
// 每够2k个字符就进行如下操作
int sum = 0;
while ( (sum += 2*k) <= s.length()){
int a = sum - 2*k;
int b = sum - k - 1;
while(a < b) {
char temp = chars[a];
chars[a] = chars[b];
chars[b] = temp;
a ++;
b --;
}
}
// 处理完所有2k为一组的,接下来处理一组不够2k个的
if ((sum - k) > s.length()){
int a = sum - 2*k;
int b = s.length() - 1;
while(a < b) {
char temp = chars[a];
chars[a] = chars[b];
chars[b] = temp;
a ++;
b --;
}
return new String(chars);
}else{
int a = sum - 2*k;
int b = sum - k - 1;
while(a < b) {
char temp = chars[a];
chars[a] = chars[b];
chars[b] = temp;
a ++;
b --;
}
return new String(chars);
}
}
看了卡哥的代码感觉清楚多了,要保证不被弄晕的前提就是我们统一将i看作是索引,也就是从0开始的,我们中途对比的变量比的都是字符串的索引值
public String reverseStr(String s, int k) {
char[] ch = s.toCharArray();
for(int i = 0; i < ch.length; i += 2 * k){
// 记住我们这里的i一直是每轮开始的第一位索引,第一轮是0,第二轮是2k,第三轮是4k...,每次加2k刚好就是下一轮第一位
// 这里i < ch.length是判断当前轮的第一位下标是否在ch数组的索引里,在的话进入循环反转,不在的话这就没有要操作的了,直接跳出,返回字符串
int start = i;// 进来之后操作的起点自然是我们的第一位i
int end = Math.min(ch.length - 1, start + k - 1);// 接下来自然就是判断最后一位的索引能不能到start+k-1
//用异或运算反转
while(start < end){
ch[start] ^= ch[end];
ch[end] ^= ch[start];
ch[start] ^= ch[end];
start++;
end--;
}
}
return new String(ch);
}
三.替换数字
public static String replace_numbers(String s){
StringBuilder result = new StringBuilder(); // 使用StringBuilder来构建结果字符串
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) >='0' && s.charAt(i) <='9'){
result.append("number");
}else{
result.append(s.charAt(i));
}
}
return result.toString();
}