算法打卡Day08 | 字符串篇-反转字符串、反转字符串Ⅱ、替换数字

44 阅读2分钟

344. 反转字符串

题目链接:leetcode.cn/problems/re…

秒过

class Solution {
    public void reverseString(char[] s) {
        //使用双指针
        int start = 0;
        int end = s.length - 1;
        while(start<=end){//⏰这里<也可以 因为针对奇数最中间的是无需交换的
            char temp = s[start];
            s[start] = s[end];
            s[end] = temp;
            start++;
            end--;
        }
    }
}

541. 反转字符串Ⅱ

题目链接:leetcode.cn/problems/re…

关键词:2k个操作可直接i+=2k

固化思维:for循环逐一遍历字符串,然后添加各种情况的限制条件,然后越加越多。但可以直接在for循环+2k去遍历操作

  • 错误代码
class Solution {
    public String reverseStr(String s, int k) {
        int start = 0;
        int end = k;
        int time = 1;
        for(int i=0; i<s.length(); i++){
            if(s.length() - i < k){
                end = s.length() - 1;
                StringBuilder sb = new StringBuilder(s);
                sb.reverse();
            }
            if(s.length() - i == k || s.length() - i < 2*k){
                reverseString(s, start, end);
            }
            start = 2*k*time + 1;
            end = 2*k*time + k;
            if(i==2*k && start < s.length() - 1){
                reverseString(s, start, end);
                time++;
            }
        }
        return s;
    }
​
    public void reverseString(String s, int start, int end) {
        char[] c = s.toCharArray();
        while(start<end){
            char temp = c[start];
            c[start] = c[end];
            c[end] = temp;
            start++;
            end--;
        }
    }
}
  • 我的解法(4ms)
class Solution {
    public String reverseStr(String s, int k) {
        for(int i=0; i<s.length(); i+=2*k){
            //
            if(i+k <= s.length()){
                s = reverseString(s, i, i+k-1);
                continue;
            }
            s = reverseString(s, i, s.length()-1);
        }
        return s;
    }
​
    public String reverseString(String s, int start, int end) {
        char[] c = s.toCharArray();
        while(start<end){
            char temp = c[start];
            c[start] = c[end];
            c[end] = temp;
            start++;
            end--;
        }
        return new String(c);
    }
}
  • 实例解法(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){
                
                char temp = ch[start];
                ch[start] = ch[end];
                ch[end] = temp;
​
                start++;
                end--;
            }
        }
        return new String(ch);
    }

54.替换数字

题目链接:kamacoder.com/problempage…

关键词:Character和String的库函数

Q:为什么从后向前填充?

A:其实很多数组填充类的问题,其做法都是先预先给数组扩容带填充后的大小,然后在从后向前进行操作。

这么做有两个好处:

  1. 不用申请新数组。
  2. 从后向前填充元素,避免了从前向后填充元素时,每次添加元素都要将添加元素之后的所有元素向后移动的问题。

Java中String类型发生改变相当于新创建了一个String,所以直接使用StringBuilder

import java.util.Scanner;
​
class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();
        StringBuilder sb = new StringBuilder();
        for(int i=0; i<s.length(); i++){
            if(Character.isDigit(s.charAt(i))){
                sb.append("number");
            }
            sb.append(s.charAt(i));
        }
        System.out.println(sb);
    }
}