代码随想录算法训练营--打卡day8

时间:2025-04-10 17:44:15

一.反转字符串II

1.题目链接

541. 反转字符串 II - 力扣(LeetCode)

2.思路

  1. 循环分组定位:使用 for 循环,每2k为一组i 每次增加 2k ,就相当于定位到下一组字符的起始位置。在每次循环中,确定当前组需要反转部分的起始索引 start(即当前循环的起始位置 i )和末尾索引 end 。
  2. 确定反转范围用 Math.min(ch.length - 1, start + k - 1) 确定 end 。 这是考虑到如果当前组的字符数不足 k 个接近字符串末尾时可能出现),就不能简单以 start + k - 1 作为末尾索引,否则会越界。取 ch.length - 1 和 start + k - 1 中的较小值,就能保证确定的 end 索引在合法范围内。

3.代码

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;
            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);
    } 
   
    
}

二.替换数字

1.题目链接

54. 替换数字(第八期模拟笔试)

2.思路

  1. 统计数字个数

  2. 创建新字符数组
    根据前面统计的数字个数 count,计算出替换后的字符串的长度( s.length() + count * 5)。用于存储替换后的字符串内容。

  3. 复制原始字符串内容

  4. 从后向前替换数字
    采用从后向前遍历的方式处理新数组 newS设置两个索引变量,一个指向新数组的末尾(newIndex = newSize - 1),另一个指向原始字符串的末尾(i = s.length() - 1)。
    在遍历过程中,如果遇到数字字符(通过 Character.isDigit(newS[i]) 判断),就从新数组的当前位置开始,依次将 “number” 的字符逆序填入,同时将索引 newIndex 向前移动 6 个位置(因为 “number” 有 6 个字符)。
    如果遇到的不是数字字符,就直接将该字符复制到新数组的当前位置,并将 newIndex 向前移动 1 个位置。

  5. 返回结果

3.代码

import java.util.Scanner;

public class Main {
    public static String replaceNumber(String s) {
/1.统计单词个数
        int count = 0;
        for (int i = 0; i < s.length(); i++) {
            if (Character.isDigit(s.charAt(i))) {
                count++;
            }
        }
/2.创建新数组
/3.复制字符串内容到新数组中
        char[] newS = new char[s.length() + count * 5];
        int newSize = newS.length;
        System.arraycopy(s.toCharArray(), 0, newS, 0, s.length());
/4.从后往前替换数字
        int newIndex = newSize - 1;
        for (int i = s.length() - 1; i >= 0; i--) {
            if (Character.isDigit(newS[i])) {
                newS[newIndex--] = 'r';
                newS[newIndex--] = 'e';
                newS[newIndex--] = 'b';
                newS[newIndex--] = 'm';
                newS[newIndex--] = 'u';
                newS[newIndex--] = 'n';
            } else {
                newS[newIndex--] = newS[i];
            }
        }

        return new String(newS);
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String s = scanner.next();
        System.out.println(replaceNumber(s));
        // 不建议在这种情况下关闭scanner,因为可能会影响后续输入操作
        // scanner.close();
    }
}