LeetCode Day8|● 344.反转字符串(原地) ● 541. 反转字符串II(i可以大步跨越) ● 卡码网:54.替换数字(ACM模式多熟悉熟悉)

day8-1 ● 344.反转字符串

整体思路

字符串和数组的思路差不多
原地操作

代码实现

class Solution {
	/**
	 * 时间复杂度: O(n)
	 * 空间复杂度: O(1)
	*/
    public void reverseString(char[] s) {
        int l = 0;
        int r = s.length - 1;
        while(l < r){
            char temp = s[l];
            s[l] = s[r];
            s[r] = temp;
            l++;
            r--;
        }
    }
}

总结

一般每门编程语言的都有库函数实现

day8-2 ● 541. 反转字符串II

整体思路

for 循环里面的 i 可以成段成段的跳越,不一定要 i++ 一步一步地跳跃

代码实现

class Solution {
    /** 
     * 时间复杂度: O(n)
	 * 空间复杂度: O(1)
	*/
    public String reverseStr(String s, int k) {
        char[] ch = s.toCharArray();
        // 每隔2k将前k个字符进行反转
        for(int i = 0; i < ch.length; i+=2*k){
            if(i + k <= ch.length){// 取等与否可以用特殊用例测试 i=0 s=abc k=3
                reverse(ch, i, i + k - 1);// 左闭右闭
                continue;
            }
            // 剩余字母少于k个,则将剩余字符全部反转
            reverse(ch, i, ch.length - 1);
        }
        return new String(ch);
    }
    private void reverse(char[] ch, int i, int j){
        while(i < j){
            char temp = ch[i];
            ch[i] = ch[j];
            ch[j] = temp;
            i++;
            j--;
        }
    }
}
class Solution {
	/** 
     * 时间复杂度: O(n)
	 * 空间复杂度: O(1)
	*/
	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 < end){
	            char temp = ch[start];
	            ch[start] = ch[end];
	            ch[end] = temp;
	            start++;
	            end--;
	        }
	    }
	    return new String(ch);
	}
}

总结

for循环里面的i可以成段成段(2k 段)的跳越,不一定要 i++ 一步一步地跳跃

day8-3 ● 卡码网:54.替换数字

题目

在这里插入图片描述

解题思路

从后向前填充,减少空间复杂度

代码实现

import  java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        String s = sc.next();
        int len = s.length();
        // 统计长度
        for(int i = 0; i < s.length(); i++){
            if(s.charAt(i) >= '0' && s.charAt(i) <= '9'){
                len += 5;
            }
        }
        // 拷贝
        char[] res = new char[len];
        for(int i = 0; i < s.length(); i++){
            res[i] = s.charAt(i);
        }
        // 替换
        for(int i = s.length() - 1, j = len - 1; i >= 0;i-- ){
            if(s.charAt(i) >= '0' && s.charAt(i) <= '9'){
                res[j--] = 'r';
                res[j--] = 'e';
                res[j--] = 'b';
                res[j--] = 'm';
                res[j--] = 'u';
                res[j--] = 'n';
                
            }else{
                res[j--] = res[i];
            }
        }
        System.out.println(res);
    }
} 

总结

acm模式得多熟悉熟悉

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值