代码随想录刷题|LeetCode 344.反转字符串 541. 反转字符串II 剑指Offer 05.替换空格 151.反转字符串里的单词 剑指Offer58-II.左旋转字符串

目录

344.反转字符串

思路

反转字符串

541. 反转字符串II

思路

反转字符串||

剑指Offer 05.替换空格

思路

替换空格

方法一:

方法二(原地扩容,不适合java):

151.反转字符串里的单词

思路

反转字符串里的单词

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

思路

左旋转字符串


344.反转字符串

题目链接:力扣

思路

        遍历,用临时指针保存,进行替换

反转字符串

class Solution {
    public void reverseString(char[] s) {

        for (int i = 0 ; i < s.length/2 ; i++) {
            char temp = s[i];
            s[i] = s[s.length-1-i];
            s[s.length-1-i] = temp; 
        }
    }
}

541. 反转字符串II

题目链接:力扣

思路

        java中String类的对象是不可改变的,String类中每一个看起来会修改String值的方法,实际上都创建并返回了一个全新的String对象,所以String自身没有灵活的reverse()功能,StringBiuder倒是有,但是这个题目是每隔一段,部分进行反转,所以StringBiuder也不是很灵活

        所以将String转换成字符数组进行操作,自定义reverse()方法

        这里continue使用真的很绝,将满足一般情况的操作写在if判断中,即保证了每次有k个元素都可以处理,又保证了最后剩下的元素进行反转

反转字符串||

        第一步:将String转换成字符数组(好操作)
        第二步:遍历数组,每2k个元素改变 i ,把没2k个字符看成一个整体
        第三步:如果 i + k <=  ch.length ,那说明这个2k整体元素是满的,那就进行反转
        第四步:题目中的两个条件(1、剩下的不够k个全反转 2、剩下的不过2k个反转前k个),其实第2种情况在第三步的步骤中已经包含了

class Solution {
    public String reverseStr(String s, int k) {

        // 将字符串转换成字符数组
        char[] ch = s.toCharArray();
        for (int i = 0; i < ch.length; i += 2*k) {

            // 每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
            // 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
            if (i + k <= ch.length) {
                reverse(ch , i, i+k-1);
                continue;
            }
            
            // 如果剩余字符少于 k 个,则将剩余字符全部反转
            reverse(ch , i , ch.length-1);
        }

        return new String(ch);
    }

    // 定义反转的函数
    public void reverse(char[] ch , int i , int j) {
        for ( ; i < j ; i++,j--) {
            char tmep = ch[i];
            ch[i] = ch[j];
            ch[j] = tmep;
        }
    }
}

剑指Offer 05.替换空格

题目链接:力扣

思路

        一开始呢,考虑的是将字符串用空格分隔,然后再进行字符串的拼接,每拼接一个单词后就加上“%20”,但是有一种情况没通过,那就是一个字符串全都是空格,这种方法是不全面的

代码随想录刷题|LeetCode 344.反转字符串 541. 反转字符串II 剑指Offer 05.替换空格 151.反转字符串里的单词 剑指Offer58-II.左旋转字符串_第1张图片

 所以将每一个字符都拿出来,如果是空格就加成“%20”,这样就是把字符串转换成字符数组

代码随想录刷题|LeetCode 344.反转字符串 541. 反转字符串II 剑指Offer 05.替换空格 151.反转字符串里的单词 剑指Offer58-II.左旋转字符串_第2张图片

        最后发现,还是搞得有点复杂了,并不用转换成字符数组的,直接使用charAt()就可以的,这道题的整体思路还是比较简单的

        在代码随想录中,提供了一个双指针的方法,这个方法适用于C++语言,但是不适用于java语言,因为java中的String对象是不可改变的,不能进行原地修改和扩容,但是思路确实很妙,空间复杂度是O(1),但是对java语言不适用

替换空格

方法一:

class Solution {
    public String replaceSpace(String s) {       
        StringBuilder ss = new StringBuilder();
       
        for (int i = 0 ; i < s.length(); i++) {
            if (s.charAt(i) == ' ') {
                ss.append("%20");               
            } else {
                ss.append(s.charAt(i));
            }
        }

        return ss.toString();
    }
}

方法二(原地扩容,不适合java):

// 摘自《代码随想录》网站
class Solution {
    public String replaceSpace(String s) {       
        if(s == null || s.length() == 0){
            return s;
        }
        //扩充空间,空格数量2倍
        StringBuilder str = new StringBuilder();
        for (int i = 0; i < s.length(); i++) {
            if(s.charAt(i) == ' '){
                str.append("  ");
            }
        }
        //若是没有空格直接返回
        if(str.length() == 0){
            return s;
        }
        //有空格情况 定义两个指针
        int left = s.length() - 1;//左指针:指向原始字符串最后一个位置
        s += str.toString();
        int right = s.length()-1;//右指针:指向扩展字符串的最后一个位置
        char[] chars = s.toCharArray();
        while(left>=0){
            if(chars[left] == ' '){
                chars[right--] = '0';
                chars[right--] = '2';
                chars[right] = '%';
            }else{
                chars[right] = chars[left];
            }
            left--;
            right--;
        }
        return new String(chars);
    }
}

151.反转字符串里的单词

题目链接:力扣

思路

        题目中说,字符串中会出现前导空格和尾随空格的情况,所以我们首先将字符串前后的空格去掉,然后对整个字符串进行分割,如果每个单词之间只有一个空格,那分割出来的整个数组就只有单词,但是如果中间有多个空格,会分割出来空字符串

        接下来对字符串进行重组,注意空字符串不要添加进去,注意不是空格,是空字符串

反转字符串里的单词

        第一步:清空字符串两边的空格
        第二步:使用空格字符串分割字符串(分割出来的数组元素有可能存在空字符串)
        第三步:进行判断,从数组后面一个元素往后添加

class Solution {
    public String reverseWords(String s) {

        s = s.trim();
        StringBuilder sb = new StringBuilder();
        String[] ss = s.split(" ");
        for (int i = ss.length - 1; i > 0; i--) {
            if (!ss[i].equals("")) {   
                sb.append(ss[i]);
                sb.append(" ");
            }
        }
        sb.append(ss[0]);

        return sb.toString();
    }
}

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

题目链接:力扣

思路

        前面部分要移动到后面,那就创建一个空字符串,先添加后面的,再添加前面的就可以

左旋转字符串

class Solution {
    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();
    }
}

你可能感兴趣的:(LeetCode学习笔记,leetcode,算法,java)