代码随想录算法训练营第八天| 344.反转字符串 ,541.反转字符串II,卡码网:54.替换数字 ,151.翻转字符串里的单词,卡码网:55.右旋转字符串。

文章讨论了几个Java编程题目,涉及字符串反转、字符处理、使用StringBuilder操作以及双指针算法。解题关键包括String的substring、StringBuilder的append和swap方法,以及如何处理数字和单词反转问题。
摘要由CSDN通过智能技术生成

344. 我仅有的18位铁粉们(假的,看到这题岂不是行手拈来?第一眼没思路的同学建议关注我一波,然后从我的第一篇文章看起哈哈哈开玩笑。这题就是经典双指针,然后就交换就行了。

public void reverseString(char[] s) {
        int left = 0;
        int right = s.length-1;
        while(left <= right){
            //交换,写不出来的同学该回去补补基础了昂
            char tmp = s[left];
            s[left] = s[right];
            s[right] = tmp;

            left++;
            right--;
        }
    }

541. 额,反正就是说这个题目真的解释的很垃圾。根本看不懂,例子也不多给几个解释。应该就是,每隔2k个字符,对前k个字符进行反转,就这么理解就行了。反转的部分就和上一题一样的。

    public String reverseStr(String s, int k) {
        char[] ch = s.toCharArray();
        // 每隔2k个字符,对前k个字符进行反转
        for (int i = 0; i < ch.length; i += 2 * k) {
            // 检测end是否会越界
            int start = i, end = Math.min(i + k - 1, ch.length - 1);
            swap(ch, start, end);
        }
        return new String(ch);
    }

    public void swap(char[] ch, int start, int end) {
        while (start < end) {
            char tmp = ch[start];
            ch[start++] = ch[end]; 
            ch[end--] = tmp;
        }
    }

 

卡码网54. 这题就很简单了,前面我们用了很多次的stringbuilder,然后主要知道isDigit()这个方法就行了,easy easy 洒洒水啦。

public static String replaceDigitsWithWord(String s) {
        StringBuilder result = new StringBuilder();
        for (char c : s.toCharArray()) {
            // 检查字符是否为数字
            if (Character.isDigit(c)) {
                // 如果是数字,替换为"number"
                result.append("number");
            } else {
                // 如果是字母,保持不变
                result.append(c);
            }
        }
        return result.toString();
    }

151. 这题第一次做可能很细节的地方会处理不好,但是做过一遍就好了。在字符串的操作里stringbuilder还是会经常用到了,也可以双指针但是太复杂了还是老老实实,简单点的好哈哈。思路:拆分字符串然后反向拼接就OK了,注意不能用reverse()方法,会反转每个字母而不是单词。

public String reverseWords(String s) {
        s = s.trim();//去除前后空格
        //可能存在多个空格分割一个单词,所以用正则“\\s+”去匹配所有空格!
        String[] st = s.split("\\s+");
        StringBuilder sb = new StringBuilder();

        //反向填充,不能用sb.reverse(),因为会反转每个字母,而不是单词了
        for(int i=st.length-1; i>=0; i--){
            sb.append(st[i]);
            // 这里末尾最后会多一个空格记得删除
            sb.append(" ");
        }

        //返回结果,最后还要最掉末尾多一个的空格
        return sb.toString().trim();

    }

卡码网55. 这题也简单的,直接用string的方法进行拼接如接图2,或者用stringbuilder也行如图1。但是可能大佬喜欢高级点,用什么负负得正去解决,我是懒得再去看他们的解法了,自己能写出来就行了,累了今天写了5题了。(再次吐槽第二题,真的恶心,看不懂题目,浪费我太久时间,头痛。)

图1:

import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int k = sc.nextInt();
        String s = sc.next();

        
        StringBuilder sb = new StringBuilder();
        sb.append(s.substring(s.length() - k, s.length()));
        sb.append(s.substring(0, s.length() - k));
        System.out.println(sb.toString());
    }
}

图2: 


import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int k = sc.nextInt();
        String s = sc.next();
        
        int length = s.length();
        // 确保旋转次数不超过字符串长度
        k = k % length;
        // 分割并重新组合字符串
        String part1 = s.substring(length - k);
        String part2 = s.substring(0, length - k);
        System.out.println(part1 + part2);

    
    }
}

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值