算法训练营day8

一、反转字符串

利用双指针和 一个临时变量解决(因为左右指针无法直接交换)

二、反转字符串二

基于反转字符一,这里叙述一下i的含义

        for (int i = 0; i < n; i += 2 * k) {
            reverse(arr,i,Math.min(i+k, n) - 1);
        }
  1. i对应的是每个2k区间中的左指针,而Math.min(i+k,n) - 1则是右指针
  2. 每次遍历剩余字符数量是 >2k ; <= 2k && > k ; <k 三种情况,前两种情况的处理方式相同,唯一不同的就是 <k 的情况,小于k,对应的 左指针 + k > 字符数组末尾,那么此时取最小值n来作为右指针刚好遍历完成
三、卡码网:54替换数字

大家第一步想到的都是转换成字符数组,但是字符数组进行更改起来就比较麻烦

这里推荐StringBuilder,一个可变的字符串对象StringBuffer & StringBuilder

通过遍历来字符数组对应情况对应添加number还是原字符

public static String replaceDigits(String s) {
        StringBuilder sb = new StringBuilder();
        
        for (char c : s.toCharArray()) {
            if (Character.isDigit(c)) {
                sb.append("number");
            } else {
                sb.append(c);
            }
        }
        
        return sb.toString();
    }
四、翻转字符串里的单词

需要解决的问题:两侧空格,单词之间多个空格,反转单词

参考链接151. k神的解题思路

关键点是K神将 反转 转换为 倒序,这个思路很重要,决定了倒序遍历,并遍历后不需要其他操作直接添加到StringBuffer提高效率

  1. 这里的双指针是用来限定某个单词的 i为左侧,j为右侧
  2. 因为每次添加单词后都会拼接一个空格(" "),所以最后trim()是为了清除最后一个单词后的空格
class Solution {
    public String reverseWords(String s) {
        s = s.trim();                                    // 删除首尾空格
        int j = s.length() - 1, i = j;
        StringBuilder res = new StringBuilder();
        while (i >= 0) {
            while (i >= 0 && s.charAt(i) != ' ') i--;   //1 搜索首个空格
            res.append(s.substring(i + 1, j + 1) + " "); // 添加单词
            while (i >= 0 && s.charAt(i) == ' ') i--;   //2 跳过单词间空格
            j = i;                                       // j 指向下个单词的尾字符
        }
        return res.toString().trim();                    // 转化为字符串并返回
    }
}
五、卡码网:55右旋转字符串

利用双指针即可解决

    public static void reverse(char[] charArray, int start, int end) {
        for (; start < end; start++, end--) {
            char tmp = charArray[start];
            charArray[start] = charArray[end];
            charArray[end] = tmp;
        }
    }
  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值