day08 反转字符串,反转字符串II,替换空格,翻转字符串里的单词

123 阅读2分钟

1. 反转字符串

力扣题目链接

public void reverseString(char[] s) {
    int left = 0;
    int right = s.length - 1;
    while (right > left) {
        char temp = s[left];
        s[left] = s[right];
        s[right] = temp;
        right--;
        left++;
    }
}

2. 反转字符串II

力扣题目链接

我感觉这道题很考察语文。将题意的进行精简和归纳然后再解题会轻松很多。

public String reverseStr(String s, int k) {
    char[] str = s.toCharArray();
    int length = s.length();
    //剩余字符大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
    //注意 i += 2 * k 因为此题的每次计数是2k
    for (int i = 0; i < length; i += 2 * k) {
        //i + k <= s.length() 这里是长度的比较,i + k 指的是长度
        if (i + k <= s.length()) {
            //这里的i是索引下标
            str = reverse(str, i, i + k - 1);
            continue;
        }
        //剩余字符少于 k 个,则将剩余字符全部反转
        str = reverse(str, i, length - 1);
    }
    String result = new String(str);
    return result;
}

/**
 * 用于反转目标字符数组中指定范围内的字符
 * @param s 目标字符数组
 * @param left 左索引
 * @param right 右索引
 * @return
 */
public char[] reverse(char[] s, int left, int right) {
    //边界问题的处理
    if (right < 0 || left >= s.length) {
        return s;
    }
    while (right > left) {
        char temp = s[left];
        s[left] = s[right];
        s[right] = temp;
        right--;
        left++;
    }
    return s;
}

3. 替换空格

力扣题目链接

public class Topic03 {
    //使用一个新的对象,复制 str,复制的过程对其判断,是空格则替换,否则直接复制,类似于数组复制
    public static String replaceSpace(String s) {
        if (s == null) {
            return s;
        }
        char[] chars = s.toCharArray();
        int length = s.length();
        StringBuffer stringBuffer = new StringBuffer();
        for (int i = 0; i < length; i++) {
            if (chars[i] == ' ') {
                stringBuffer.append("%20");
            }else {
                stringBuffer.append(chars[i]);
            }
        }
        String result = stringBuffer.toString();
        return result;
    }
}

4. 翻转字符串里的单词

力扣题目链接

/**
 * 不使用Java内置方法实现
 * <p>
 * 1.去除首尾以及中间多余空格
 * 2.反转整个字符串
 * 3.反转各个单词
 */
public String reverseWords(String s) {
    // System.out.println("ReverseWords.reverseWords2() called with: s = [" + s + "]");
    // 1.去除首尾以及中间多余空格
    StringBuilder sb = removeSpace(s);
    // 2.反转整个字符串
    reverseString(sb, 0, sb.length() - 1);
    // 3.反转各个单词
    reverseEachWord(sb);
    return sb.toString();
}

private StringBuilder removeSpace(String s) {
    int start = 0;
    int end = s.length() - 1;
    //移除开头的空格
    while (s.charAt(start) == ' '){
        start++;
    }
    //移除结尾的空格
    while (s.charAt(end) == ' '){
        end--;
    }
    StringBuilder sb = new StringBuilder();
    while (start <= end) {
        char c = s.charAt(start);
        //举例画图体验一下
        if (c != ' ' || sb.charAt(sb.length() - 1) != ' ') {
            sb.append(c);
        }
        start++;
    }
    return sb;
}

/**
 * 反转字符串指定区间[start, end]的字符
 */
public void reverseString(StringBuilder sb, int start, int end) {
    while (start < end) {
        char temp = sb.charAt(start);
        sb.setCharAt(start, sb.charAt(end));
        sb.setCharAt(end, temp);
        start++;
        end--;
    }
}

private void reverseEachWord(StringBuilder sb) {
    int start = 0;
    int end = 1;
    int n = sb.length();
    while (start < n) {
        while (end < n && sb.charAt(end) != ' ') {
            end++;
        }
        reverseString(sb, start, end - 1);
        start = end + 1;
        end = start + 1;
    }
}

5. 左旋转字符串

力扣题目链接

具体步骤为:

  1. 反转区间为前n的子串
  2. 反转区间为n到末尾的子串
  3. 反转整个字符串
public String reverseLeftWords(String s, int n) {
    StringBuilder stringBuilder = new StringBuilder(s);
    reverseString(stringBuilder, 0, n - 1);
    reverseString(stringBuilder, n, s.length() - 1);
    reverseString(stringBuilder, 0, s.length() - 1);
    return stringBuilder.toString();
}

/**
 * 反转字符串指定区间[start, end]的字符
 */
public void reverseString(StringBuilder sb, int start, int end) {
    while (start < end) {
        char temp = sb.charAt(start);
        sb.setCharAt(start, sb.charAt(end));
        sb.setCharAt(end, temp);
        start++;
        end--;
    }
}