代码随想录Day8 | 344.反转字符串、541.反转字符串II、54、替换数字、151.反转字符串里的单词、右旋转字符串

这篇博客总结了LeetCode中涉及字符串操作的题目,包括344.反转字符串、541.反转字符串II、54.替换数字、151.反转字符串里的单词和右旋转字符串。博主分享了不同题目的解题思路,如双指针法、字符数组转换、遍历计数等,并提到了关键的编程技巧,如Character.isDigit、StringBuilder和异或法交换数值。

目录

344.反转字符串

541.反转字符串II

尝试

题解

收获

54.替换数字

尝试

151.反转字符串里的单词

尝试

题解

收获

右旋转字符串

尝试(AC)

 收获


344.反转字符串

题目:344. 反转字符串 - 力扣(LeetCode)

思路:双指针,左右交换

541.反转字符串II

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

视频讲解:字符串操作进阶! | LeetCode:541. 反转字符串II_哔哩哔哩_bilibili

思路:遍历计数,每次达到2k,就用反转字符串的方式,反转前k个字符,怎么知道有2k个了呢?主要是这里传进来的是String,我能不能先存在一个char[ ]里面,之后转换为String返回出去。

  • 我想的是count记录遍历了多少次2k,用于给left和right添加偏移量
  • cur计算遍历次数,每2k次重置
  • 通过while循环,反转前k个字符
尝试
class Solution {
    public String reverseStr(String s, int k) {
        char[] result = new char[s.length()];
        int cur = 0;
        int count =0;
        for(int i=0;i<s.length();i++){
            cur++;
            if(cur==2*k){
                int left = 0 + 2*k*count;
                int right = k-1 + 2*k*count;
                while(left<right){
                    result[left] =  s.charAt(right);
                    result[right] =  s.charAt(left);
                    right--;
                    left++;
                    if(right==left){
                        result[right] = s.charAt(right);
                    }
                }
                count++;
                cur=0;
            }
        }
        String str = new String(result);
        return str;
    }
}
题解
class Solution {
    public String reverseStr(String s, int k) {
        char[] result = s.toCharArray();
        int n = s.length();
        for(int i=0;i<n;i+=2*k){
            int left = i;
            int right = Math.min(i + k - 1,n-1);
            while(left<right){
                char temp = result[left];
                result[left++] = result[right];
                result[right--] = temp;
            }
        }
        return new String(result);
    }
}
收获
  • 将字符串转换为字符数组:char[] result = s.toCharArray();
  • 每计数2k就反转字符,可以通过【i += 2 * k】实现
  • 字符数组转换为String:new String(result),直接通过new的方式就能实现

54.替换数字

题目:54. 替换数字(第八期模拟笔试) (kamacoder.com)

思路:

  • 把所有数字用特殊字符‘#’替换掉,打印的时候,遇到#就输出number
  • 不知道要怎么用卡码网
  • 不知道有没有函数能直接判断字符是否为数字
尝试
import 

class soultion(){
    public static void main (String[] args) {
        /* code */
        char[] result = s.toCharArray();
        int length = s.length();
        for(int i=0;i<s.length();i++){
            if(result[i]不是字符){
                result[i] = '#';
            }
        }
        for(char i :result){
            if(i=='#'){
                System.out.print("number");
            }else{
                 System.out.print(i);
            }
        }
    }
}

收获

  • 题目理解错了!题目要求是返回字符串来的
  • Character.isDigit——判断字符是否为数字
  • Scanner in = new Scanner(System.in)——读取用户输入
  • String s = in.nextLine()——读取用户输入的一行字符串,存入到变量中
  • StringBuilder用append来添加内容

151.反转字符串里的单词

题目:151. 反转字符串中的单词 - 力扣(LeetCode)

思路:

  • 双指针,先去掉前导、尾随空格,存入新的String
  • 从尾部开始扫描,遇到空格就把该单词存入数组,并加上空格
  • 通过s的长度判断最后一个单词,如果是最后一个单词,就不加空格
  • 把数组转换为String类型返回

尝试
class Solution {
    public String reverseWords(String s) {
        StringBuilder result = new StringBuilder();
        int n = s.length();
        int left = 0;
        int right = n-1;
        for(int i =0;i<n;i++){
            while(left<right){
                if(s.charAt(left)==' '){
                    left++;
                }
                if(s.charAt(right)==' '){
                    right--;
                }
            }
        }
        for(int i=0;i<right-left;i++){
            #我想的是,从尾部开始遍历,遍历到空格,就把当前位置到上一个空格的字符appen进result里
            #所以,还需要一个指针定在末尾,存入单词后,该指针指向当前位置,当前的right接着往回走
            while(right>left){
                if(s.charAt(right)==' '){
                    
                }
                right--;
            }
        }
    }
}
题解
class Solution {
    public String reverseWords(String s) {
        // 1.去除首尾以及中间多余空格
        StringBuilder sb = removeSpace(s);
        // 2.反转整个字符串
        reverseString(sb, 0, sb.length() - 1);
        // 3.反转各个单词
        reverseEachWord(sb);
        return sb.toString();
    }

    private StringBuilder removeSpace(String 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++;
        }
        return sb;
    }

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

    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;
        }
    }
}
收获
  • 双指针移除数组元素的方法给忘了,应该是慢指针当作写指针,快指针遍历整个数组。
  • 思路:去除首尾以及中间多余空格——>反转整个字符串——>反转各个单词
  • 去除多余空格
    • 双指针,先把字符串两端的空格删掉
    • 通过StringBuilder接收字符,当前字符不是空格 ||  当前StringBuilder最后一位不是空格,就接着append
  • 反转字符串指定区间[start, end]的字符
    • 传入StringBuilder,start,end
    • 通过setCharAt(start, sb.charAt(end)),交换指定位置的字符
  • 反转每个单词
    • 遍历整个StringBuilder
    • 只要快指针没有到尾,快指针指向的不是空格
      • 调用reverString函数
    • 慢指针指向快指针的后一个位置,因为此时快指针指向的是空格
    • 快指针指向慢指针后一个位置

右旋转字符串

题目:55. 右旋字符串(第八期模拟笔试) (kamacoder.com)

思路:for循环,用Stringbuilder,前n-k个字符往后挪k个位置,先把后面的append进去Stringbuilder,再append前面的

尝试(AC)
import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int k = in.nextInt(); // 使用nextInt()读取整数
        in.nextLine(); // 消耗掉nextInt()留下的换行符
        String s = in.nextLine();
        StringBuilder sb = new StringBuilder();
        int n = s.length();
        int count = k;
        // 反转前k个字符
        for (int i = 0; i < k; i++) {
            sb.append(s.charAt(n -count ));
            count--;
        }

        // 追加剩余的字符串
        for (int i = 0; i < n-k; i++) {
            sb.append(s.charAt(i));
        }

        System.out.println(sb.toString());
    }
}
 收获
  • 异或法交换两个数的值(关键:一个值如果连续异或同一个值两次,会还原为原始值。
    • start  ^= end    :(start = start ^ end)
    • end   ^= start   :  (end = end ^start   = end ^ start ^ end = start)
    • start  ^= end    :(start = start^end  = end ^ start ^ start = end
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值