代码随想录算法训练营day8|344.反转字符串,541. 反转字符串II,剑指Offer05.替换空格,151.翻转字符串里的单词,剑指Offer58-II.左旋转字符串

344.反转字符串

力扣

思路:

1. 遍历交换

2. 利用双指针(l,r)

要注意的代码细节:

1. 位运算法用于交换

class Solution {
    public void reverseString(char[] s) {
        int l = 0;
        int r = s.length-1;
        while(l

541. 反转字符串II

力扣

思路:

 1.题意:每隔前2k个字符,反转k个;当只剩不够k个时全部反转。

要注意的代码细节:

1. 把String转换成char[]:利用toCharArray()方法。

1. int end = Math.min(ch.length-1,start+k-1); 的写法【用来判断尾数够不够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

剑指Offer05.替换空格

力扣

思路:

1. 扩充数组到每个空格替换成"%20"之后的大小。

2. 利用双指针法,i指向新长度的末尾,j指向旧长度的末尾,从后向前替换空格。【若从前先后填充,每次添加元素,都要将添加元素之后的所有元素向后移动。】

要注意的代码细节:

1. 扩充String:利用 StringBuilder 和 append() 方法。

class Solution {
    public String replaceSpace(String s) {
        if(s==null ||s.length()==0){
            return s;
        }
        StringBuilder str = new StringBuilder();
        for(int i = 0; i=0){
            if(ch[l]==' '){
                ch[r--]='0';
                ch[r--]='2';
                ch[r--]='%';
                l--;
            } else{
                ch[r--]=ch[l--];
            }
        }
        return new String(ch);
    }
}

151.翻转字符串里的单词

力扣

 思路:

1. 移除首尾及中间多余空格;【双指针法】

2. 将整个字符串反转;

3. 将每个单词反转。

class Solution {
    public String reverseWords(String s) {
        char[] ch = s.toCharArray();
        ch = removeExtraSpaces(ch);
        reverse(ch, 0, ch.length - 1);
        reverseEachWord(ch);
        return new String(ch);
    }

    //1.【快慢指针】去除多余空格
    public char[] removeExtraSpaces(char[] ch) {
        int slow = 0;
        for (int fast = 0; fast < ch.length; fast++) {
            if (ch[fast] != ' ') {
                if (slow != 0){
                    ch[slow++] = ' ';
                } 
                while (fast < ch.length && ch[fast] != ' '){
                    ch[slow++] = ch[fast++];
                }
            }
        }
        char[] newChars = new char[slow];
        System.arraycopy(ch, 0, newChars, 0, slow); 
        return newChars;
    }

    //2.【双指针】反转字符串
    public void reverse(char[] ch, int l, int r) {
        if (r >= ch.length) {
            System.out.println("set a wrong right");
            return;
        }
        while (l < r) {
            ch[l] ^= ch[r];
            ch[r] ^= ch[l];
            ch[l] ^= ch[r];
            l++;
            r--;
        }
    }

    //3.反转单词
    public void reverseEachWord(char[] ch) {
        int start = 0;
        for (int end = 0; end <= ch.length; end++) {
            if (end == ch.length || ch[end] == ' ') {
                reverse(ch, start, end - 1);
                start = end + 1;
            }
        }
    }
}

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

力扣

思路:

【局部反转+整体反转】

1. 反转整个字符串;

2. 反转下标为0~n-1的部分;

3. 反转剩下部分。

class Solution {
    public String reverseLeftWords(String s, int n) {
        char[] ch = s.toCharArray();
        reverse(ch,0,ch.length-1);
        reverse(ch,0,ch.length-1-n);
        reverse(ch,ch.length-n,ch.length-1);
        return new String(ch);
    }
    private char[] reverse(char[] ch, int l, int r){
        while(l

你可能感兴趣的:(leetcode,数据结构)