day 8 第四章 字符串

41 阅读2分钟

题目

344.反转字符串

很简单,直接ac

对于字符串,我们定义两个指针(也可以说是索引下标),一个从字符串前面,一个从字符串后面,两个指针同时向中间移动,并交换元素。

541. 反转字符串II

题不难,但是大意了.....

在遍历字符串的过程中,只要让 i += (2 * k),i 每次移动 2 * k 就可以了,然后判断是否需要有反转的区间。
所以当需要固定规律一段一段去处理字符串的时候,要想想在在for循环的表达式上做做文章。

    public String reverseStr(String s, int k) {
        char[] arr = s.toCharArray();
        for(int i = 0; i < arr.length; i += 2*k){
            int left = i;
            int right = i + k > arr.length ? arr.length - 1 : i + k - 1;  //判断反转区间 
            // int right = Math.min(arr.length - 1, i + k - 1);  //判断反转区间
            while(left < right){
                    char temp = arr[left];
                    arr[left] = arr[right];
                    arr[right] = temp;
                    right--;
                    left++;
            }
        }
        return new String(arr);
    }

剑指Offer 05.替换空格

使用一个新的对象,复制 str,复制的过程对其判断,是空格则替换,否则直接复制,类似于数组复制。 在java中使用StringBuilder sb = new StringBuilder(); 操作字符串方便。

    public String replaceSpace(String s) {
        StringBuilder sb = new StringBuilder();
        for(char c : s.toCharArray()){
            if(c == ' '){
                sb.append("%20");
            }else{
                sb.append(c);
            }
        }
        return sb.toString();
    }

151.翻转字符串里的单词

先熟悉下库函数解法

class Solution {
    public String reverseWords(String s) {
        // 除去开头和末尾的空白字符
        s = s.trim();
        // 正则匹配连续的空白字符作为分隔符分割
        List<String> wordList = Arrays.asList(s.split("\\s+"));
        Collections.reverse(wordList);
        return String.join(" ", wordList);
    }
}

剑指Offer58-II.左旋转字符串

第一反应想到StringBuilder,直接列表遍历拼接秒了;(利用求余运算,可以简化代码

    public String reverseLeftWords(String s, int n) {
        StringBuilder sb = new StringBuilder();
        for(int i = n; i < s.length(); i++){
            sb.append(s.charAt(i));
        }
        for(int i = 0; i < n; i++){
            sb.append(s.charAt(i));
        }
        return sb.toString();
    }

其他方法

  1. s.substring()获取字符串 s[n:]和s[:n] 切片,使用 "+" 运算符拼接并返回即可
    public String reverseLeftWords(String s, int n) {
        return s.substring(n, s.length()) + s.substring(0, n);
    }
  1. 就用String,利用求余运算,可以简化代码
    public String reverseLeftWords(String s, int n) {
        String res = "";
        for(int i = n; i < n + s.length(); i++)
            res += s.charAt(i % s.length());
        return res;
    }
  1. 可以通过局部反转+整体反转 达到左旋转的目的。 (空间复杂度O(1))
    具体步骤为:

    1. 反转区间为前n的子串
    2. 反转区间为n到末尾的子串
    3. 反转整个字符串

    最后就可以得到左旋n的目的,而不用定义新的字符串,完全在本串上操作。

class Solution {
    public String reverseLeftWords(String s, int n) {
        int len=s.length();
        StringBuilder sb=new StringBuilder(s);
        reverseString(sb,0,n-1);
        reverseString(sb,n,len-1);
        return sb.reverse().toString();
    }
     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--;
            }
        }
}

收获

  1. java操作
    1. Java字符数组char和字符串String互相转化
      char[] arr = str.toCharArray();
      String string = String.copyValueOf(arr);
    2. 用stringBuffer或者stringBuilder自带的reverse方法
    public static String reverseTestOne(String s) {
        return new StringBuffer(s).reverse().toString();
    }
  1. 补充一道面试题
    Java交换值swap(a, b) java