leetcode刷题篇 第四篇

100 阅读1分钟

这里是第四篇

主题:字符串处理

主要技巧:双指针法 加快遍历速度 如果需要处理循环嵌套时双指针也有奇效

反转字符串

反转使用双指针法即可,这里末尾的值可以直接获取到 加快遍历速度

双指针的经典用法


class Solution {

    public void reverseString(char[] s) {

        int i = 0,j = s.length - 1;

        while(i < j){

            s[i] ^= s[j];

            s[j] ^= s[i];

            s[i] ^= s[j];

            i++;

            j--;

        }

    }

}

反转字符串二

主要是对end指针的处理 两种情况,对比即可


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,end;

            end = Math.min(ch.length - 1,start + k - 1);

            while(start < end){

                ch[start] ^= ch[end];

                ch[end] ^= ch[start];

                ch[start] ^= ch[end];

                start++;

                end--;

            }

        }

        return new String(ch);

    }

}

替换空格

特征:数组填充

解法:预留空间,从后向前遍历

可以记住这个解法

补充一个知识点:SE基础

String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且浪费大量优先的内存空间

StringBuffer是可变类,和线程安全的字符串操作类,任何对它指向的字符串的操作都不会产生新的对象。每个StringBuffer对象都有一定的缓冲区容量,当字符串大小没有超过容量时,不会分配新的容量,当字符串大小超过容量时,会自动增加容量


class Solution {

    public String replaceSpace(String s) {

        if(s == null || s.length()==0){

            return s;

        }

        StringBuilder stringBuilder = new StringBuilder();

        for (int i = 0; i <= s.length() - 1; i++) {

            if (s.charAt(i) == ' ') {

                stringBuilder.append("  ");

            }

        }

        if(stringBuilder.length()==0){

            return s;

        }

        int i = s.length() - 1;

        // 空格拼接起来

        s += stringBuilder.toString();

        int j = s.length() - 1;

        char[] chars = s.toCharArray();

        while(i >= 0){

            if(chars[i] == ' '){

                chars[j--] = '0';

                chars[j--] = '2';

                chars[j] = '%';

            }else{

                chars[j] = chars[i];

            }

            i--;

            j--;

        }

        return new String(chars);

    }

}