【随想录】Day8—第四章 字符串part01


题目1: 344. 反转字符串


1- 思路

  • 定义 swap 方法,两个指针 通过中间变量交换

2- 题解

⭐反转字符串 ——题解思路

在这里插入图片描述

class Solution {

    public void reverseString(char[] s) {
        int left = 0;
        int right = s.length-1;
        while(left<right){
            swap(left,right,s);
            left++;
            right--;
        }
    }

    public void swap(int l,int r,char[] s){
        char tmp = s[l];
        s[l] = s[r];
        s[r] = tmp;
    }
}

题目2: 541. 反转字符串II


1- 思路

  • 此处思路与上述类似,需要先将 String类型的字符串转为 char 数组
  • 此时需要定义一个 swap 函数与上述类似,但遍历逻辑需要修改

由于需要遍历 char 数组实现交换,因此本题难点在于遍历逻辑

  • 每次遍历需要确定起始点
  • start 起点为 :当前遍历到的 i 的位置,i 的步长为 2*k
  • end 终点为:(两种情况,到结尾和没到末尾)两者中取小的
    • len-1 :即已经到末尾,此时剩余元素的长度小于 k
    • start+k-1:此时没到末尾
for(int i = 0 ; i < len;i+=2*k){
    int start = i;
    int end = Math.min(len-1,start+k-1);
    swap(start,end,str);
}

2- 题解

⭐反转字符串II ——题解思路

在这里插入图片描述

class Solution {
    public String reverseStr(String s, int k) {
        // 先将String转为 char 数组
        char[] str = s.toCharArray();
        int len = str.length;

        for(int i = 0 ; i < len;i+=2*k){
            int start = i;
            int end = Math.min(len-1,start+k-1);
            swap(start,end,str);
        }

        return new String(str);
    }

    // 定义一 交换方法
    public void swap(int l,int r,char[] str){
        while(l<r){
            char tmp = str[l];
            str[l] = str[r];
            str[r] = tmp;
            l++;
            r--;
        }
    }
}

题目3: 54.替换数字


1- 思路

  • 输入一个 String ——> 将 String转为字符数组 ——> 遍历字符数组,若遇到数字字符则直接 替换当前字符数组 值为 number

2- 题解

⭐替换数字 ——题解思路

在这里插入图片描述

import java.util.*;

public class Main{

    public static String reverse(String str){
        StringBuilder sb = new StringBuilder();
        char[] charStr = str.toCharArray();
        int len = str.length();
        for(int i = 0 ; i < len;i++){
            if( charStr[i]-'0'<=9 && charStr[i]-'0'>=0){
                sb.append("number");
            }else{
                sb.append(charStr[i]);
            }
        }
        return sb.toString();
    }

    public static void main (String[] args) {

        Scanner sc = new Scanner(System.in);
        String input = sc.next();
        String res = reverse(input);
        System.out.println(res);
    }

}

题目4: 151. 反转字符串中的单词 【5★】


1- 思路

  • 本题难点在于 如何处理 前后的空格以及 字符串种的多个空格

所以解题思路如下:

  • 移除多余空格
  • 将整个字符串反转
  • 将每个单词反转

举个例子,源字符串为:"the sky is blue "

  • 移除多余空格 : “the sky is blue”
  • 字符串反转:“eulb si yks eht”
  • 单词反转:“blue is sky the”
定义 removeSpace方法
  • 移除字符串前空格
  • 移除字符串后空格
  • 移除字符串中空格
private StringBuilder removeSpace(String s) {
    // System.out.println("ReverseWords.removeSpace() called with: s = [" + s + "]");
    int start = 0;
    int end = s.length() - 1;
    while (s.charAt(start) == ' ') start++;
    while (s.charAt(end) == ' ') end--;
    StringBuilder sb = new StringBuilder();
    while (start <= end) {
        char c = s.charAt(start);
        if (c != ' ' || sb.charAt(sb.length() - 1) != ' ') {
            sb.append(c);
        }
        start++;
    }
    // System.out.println("ReverseWords.removeSpace returned: sb = [" + sb + "]");
    return sb;
}
定义reverseAll方法
/**
 * 反转字符串指定区间[start, end]的字符
 */
public void reverseString(StringBuilder sb, int start, int end) {
    // System.out.println("ReverseWords.reverseString() called with: sb = [" + sb + "], start = [" + start + "], end = [" + end + "]");
    while (start < end) {
        char temp = sb.charAt(start);
        sb.setCharAt(start, sb.charAt(end));
        sb.setCharAt(end, temp);
        start++;
        end--;
    }
    // System.out.println("ReverseWords.reverseString returned: sb = [" + sb + "]");
}
定义 reverseEach 方法

:::info
通过 start 和 end 指针来找一个单词

  • 1.数据结构
    • int start = 0:定义一个开始为 0 的指针
    • int end = 1:end 为start+1
    • int n = sb.length():判断是否遍历到sb的末尾
  • 2. 翻转字符串
    • 2.1 定位 end
      • 如果 end < n 且 sb.charAt(end) != ’ ’ ,证明没有到 end
      • 若果到了 end ,则对单词进行翻转
    • 2.2 更新 start 和 end
      • start = end + 1;
      • end = start + 1;
        :::
private void reverseEachWord(StringBuilder sb) {
    int start = 0;
    int end = 1;
    int n = sb.length();
    while (start < n) {
        while (end < n && sb.charAt(end) != ' ') {
            end++;
        }
        reverseString(sb, start, end - 1);
        start = end + 1;
        end = start + 1;
    }
}

2- 题解

⭐反转字符串中的单词 ——题解思路

在这里插入图片描述

class Solution {
   /**
     * 不使用Java内置方法实现
     * <p>
     * 1.去除首尾以及中间多余空格
     * 2.反转整个字符串
     * 3.反转各个单词
     */
    public String reverseWords(String s) {
        // System.out.println("ReverseWords.reverseWords2() called with: s = [" + s + "]");
        // 1.去除首尾以及中间多余空格
        StringBuilder sb = removeSpace(s);
        // 2.反转整个字符串
        reverseString(sb, 0, sb.length() - 1);
        // 3.反转各个单词
        reverseEachWord(sb);
        return sb.toString();
    }

    private StringBuilder removeSpace(String s) {
        // System.out.println("ReverseWords.removeSpace() called with: s = [" + s + "]");
        int start = 0;
        int end = s.length() - 1;
        while (s.charAt(start) == ' ') start++;
        while (s.charAt(end) == ' ') end--;
        StringBuilder sb = new StringBuilder();
        while (start <= end) {
            char c = s.charAt(start);
            if (c != ' ' || sb.charAt(sb.length() - 1) != ' ') {
                sb.append(c);
            }
            start++;
        }
        // System.out.println("ReverseWords.removeSpace returned: sb = [" + sb + "]");
        return sb;
    }

    /**
     * 反转字符串指定区间[start, end]的字符
     */
    public void reverseString(StringBuilder sb, int start, int end) {
        // System.out.println("ReverseWords.reverseString() called with: sb = [" + sb + "], start = [" + start + "], end = [" + end + "]");
        while (start < end) {
            char temp = sb.charAt(start);
            sb.setCharAt(start, sb.charAt(end));
            sb.setCharAt(end, temp);
            start++;
            end--;
        }
        // System.out.println("ReverseWords.reverseString returned: sb = [" + sb + "]");
    }

    private void reverseEachWord(StringBuilder sb) {
        int start = 0;
        int end = 1;
        int n = sb.length();
        while (start < n) {
            while (end < n && sb.charAt(end) != ' ') {
                end++;
            }
            reverseString(sb, start, end - 1);
            start = end + 1;
            end = start + 1;
        }
    }
}

题目5: 55.右旋转字符串 【5★】


1- 思路

  • 先把整个字符串反转
  • 再反转前部分 (0-k)
  • 再反转后半部分(k-n)

2- 题解

⭐右旋转字符串 ——题解思路

在这里插入图片描述

import java.util.*;
public class Main{
    
    public static void reverse(char[] str,int l,int r){
        while(l<r){
            char tmp = str[l];
            str[l] = str[r];
            str[r] = tmp;
            l++;
            r--;
        }
        
    }
    
    public static void main (String[] args) {
    /* code */
        Scanner sc = new Scanner(System.in);
        int k = sc.nextInt();
        String input = sc.next();
        char[] str = input.toCharArray();
        
        reverse(str,0,str.length-1);
        
        reverse(str,0,k-1);
        reverse(str,k,str.length-1);
        System.out.println(str);
    }
}

  • 24
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值