代码随心录算法训练营二十四期第八天|LeetCode344. 反转字符串、LeetCodeLCR541. 反转字符串 II、LeetCode 122. 路径加密、LeetCode151. 反转字符串中

LeetCode344. 反转字符串

题目链接:344. 反转字符串
这道题很简单,利用双指针就可以解决了。
左指针从头遍历,右指针从尾部遍历,同时交换两指针指向的字符即可。
代码如下:

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

        while(left < right) {
            char tem = s[left];
            s[left] = s[right];
            s[right] = tem;
            right--;
            left++;

        }

    }
}

时间复杂度O(n),空间复杂度O(1)。

二、LeetCode541. 反转字符串 II

题目链接:541. 反转字符串 II
我们用双指针法翻转字符串,所以现将字符串利用函数String.toCharArray()转变成字符数组。
然后for循环遍历字符数组,每次循环自增2*k;然后定位左右两个指针的位置:
left = i; right = Math.min(ch.length - 1, i + k - 1);
随后翻转两个指针之间的字符。
最后将反转后的字符再强制转化成字符串返回。
代码如下:

class Solution {
    public String reverseStr(String s, int k) {
        char[] ch = s.toCharArray();
        for(int i = 0; i < ch.length; i += (2 * k)) {
            int left = i;

            int right = Math.min(ch.length - 1, i + k - 1);
            while(left < right) {
                char tem = ch[left];
                ch[left] = ch[right];
                ch[right] = tem;
                right--;
                left++;
            }
        }
        return new String(ch);

    }
}

三、LeetCodeLCR 122. 路径加密

题目链接:LCR 122. 路径加密
这道题需要对对字符串中字符的操作,所以现将该字符串转化成字符数组,然后在遍历字符数组,对符合条件的字符进行操作。
代码如下:

class Solution {
    public String pathEncryption(String path) {
        char[] ch = path.toCharArray();
        for(int i = 0; i < ch.length; i++) {
            if(ch[i] == '.') ch[i] = ' ';
        }
        return new String(ch);

    }
}

四、LeetCode151. 反转字符串中的单词

题目链接:151. 反转字符串中的单词
现将字符串转化成字符数组,再创建一个长度为原字符串长度加1的新字符数组(后边插入单词的时候会多一个空格符)。
从后往前去遍历原数组,先去掉多余空格,用两个指针定位到每个单词的收尾位置,再将单词放入新数组中,同时加入一个空格字符。
结束后新字符数组的结尾会多出一个空格符,所以将出去最后一个字符后转化成字符串返回。

class Solution {
    public String reverseWords(String s) {
        char[] ch = s.toCharArray();
        char[] newarr = new char[ch.length + 1];

        int pos = 0;
        for(int i = ch.length - 1; i >= 0; i--) {//从后往前去遍历
            while(i >= 0 && ch[i] == ' ') i--;//去掉多余空格
            int right = i;//定位单词的最后一个字符
            while(i >= 0 && ch[i] != ' ') i--;
            int left = i + 1;//每个单词的定位单词的起始位置

            for(int j = left; j <= right; j++) {//将每个单词字符插入到新字符数组,然后加个空格符
                newarr[pos++] = ch[j];
                if(j == right) {
                    newarr[pos++] = ' ';
                }
            }

        }
        if(pos == 0) {
            return "";
        }else {
            return new String(newarr, 0, pos - 1);//去掉新字符数组的最后一个字符" ",再转化成字符串返回
        }

    }
}

五、LeetCodeLCR 182. 动态口令

题目链接:LCR 182. 动态口令
将原字符串转化成字符数组,再创建一个新字符数组newarr,长度为原字符数组长度加目标值target,随后将原字符数组复制到新数组,再加前target个字符复制到后面。
返回时,将新数组从target到最后的字符数组转化成字符串。
代码如下:

class Solution {
    public String dynamicPassword(String password, int target) {
        char[] ch = password.toCharArray();
        char[] newarr = new char[ch.length + target];

        int j = 0;
        for(int i = 0; i < newarr.length; i++) {
            if(j >= ch.length) j = 0;
            newarr[i] = ch[j++];
        }

        return new String(newarr, target, ch.length);

    }
}

总结

对字符串的各种操作函数还不熟悉。

你可能感兴趣的:(Java算法题解,算法,leetcode,数据结构,java)