代码随想录算法训练营第八天|字符串part01

93 阅读2分钟

一.反转字符串

没啥好说的,就双指针法.

唯一要注意一下的就是别忘了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();
}