力扣学习day05-3

力扣学习day05-3

剑指offer 05-替换空格

题目

image-20220125193003442

代码实现

class Solution {
    // public String replaceSpace(String s) {
    //     // 题目有说有长度,即s不为空。
    //     char[] sArray = s.toCharArray();
    //     String s2 = "";
        
    //     for(int i = 0;i < sArray.length;i++){
    //         if(sArray[i] == ' '){
    //             s2 = s2 + "%20";
    //             continue;
    //         }
    //         s2 = s2 + sArray[i];
    //     }
        
    //     return s2;
    // }

    // 速度优化,String底层是不可变的,所以通过+的方式会慢一点(大量空格的情况下)。6ms --> 0ms
    public String replaceSpace(String s) {
        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 index1 = s.length() - 1;
        s += str.toString();
        int index2 = s.length() - 1;
        char[] sArray = s.toCharArray();
        while(index1 >= 0){
            if(sArray[index1] == ' '){
                sArray[index2--] = '0';
                sArray[index2--] = '2';
                sArray[index2--] = '%';
                index1--;
            } else{
                sArray[index2--] = sArray[index1--];
            }
        }

        return new String(sArray);
    }
}

541-反转字符串II

题目

image-20220125215701735

代码实现

class Solution {
    public String reverseStr(String s, int k) {
        char[] result = s.toCharArray();
        int i = k * 2 - 1;

        // 先将满足2k长度的模块前k反转
        for(;i < result.length;i += k * 2){
            int pre = i - k * 2 + 1;
            int cur = i - k;
            reverse(pre,cur,result);
        }

        // 然后将尾部按情况处理。
        i = i - k * 2 + 1;
        int cur = 0;
        if(result.length - i < k){
            cur = result.length - 1;
        } else{
            cur = i + k - 1;
        }
        reverse(i,cur,result);

        return new String(result);
    }
    public void reverse(int pre,int cur,char[] result){
        char temp = 'a';
        while(pre < cur){
            temp = result[pre];
            result[pre] = result[cur];
            result[cur] = temp;
            pre++;
            cur--;
        }
    }

    // 其他大佬的更易理解且简洁的方法,不过速度测出来要慢一丢丢。0ms->1ms
    // public String reverseStr(String s, int k) {
    //     char[] ch = s.toCharArray();
    //     for(int i = 0; i < ch.length; i += 2 * k){
    //         int start = i;
    //         //这里是判断尾数够不够k个来取决end指针的位置
    //         int 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);
    // }

}

151-翻转字符串里的单词

题目

image-20220125233311158

image-20220125233416577

代码

class Solution {
    public String reverseWords(String s) {
        char[] source = s.toCharArray();
        // 第一步,去除多余的空格
        int slow = 0;
        int fast = 0;
        
        // 去掉头部空格
        while(fast < source.length && source[fast] == ' '){
            fast++;
        }
        // 去掉中间多余空格
        while(fast < source.length){
            if(source[fast] == ' ' && source[fast - 1] == ' '){
                fast++;
                continue;
            }
            source[slow++] = source[fast++];
        }
        // 去掉尾部空格
        if(source[fast - 1] == ' '){
            slow--;
        }
        //造一个新的数组存放
        char[] result = new char[slow];
        for(int i = 0;i < result.length;i++){
            result[i] = source[i];
        }

        // 第二步,反转整个字符串
        reverse(0,result.length-1,result);

        // 第三步,反转单词
        fast = 0;
        slow = 0;
        while(fast < result.length){
            if(result[fast] != ' '){
                fast++;
                continue;
            }
            reverse(slow,fast - 1,result);
            slow = fast + 1;
            fast++;
        }
        reverse(slow,fast - 1,result);

        return new String(result);
    }
    public void reverse(int pre,int cur,char[] result){
        char temp = 'a';
        while(pre < cur){
            temp = result[pre];
            result[pre] = result[cur];
            result[cur] = temp;
            pre++;
            cur--;
        }
    }
    // 夜已深,其他大佬的风骚操作明天有时间再看了。
    // 还有这个什么空间复杂度O(1)和原地解法明天记得看哈是不是。
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

人山人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值