day8任务

今天写字符串,这边的操作还是蛮多的,这两天刷其他题用到不少字符串的操作,有空可以整理下,今天先mark。也没几张壁纸了,只是单纯觉得系统生成的有点丑。


1.反转字符串:代码随想录 (programmercarl.com)

力扣链接:. - 力扣(LeetCode)

这个题太熟了,双指针的入门用法。建议熟悉一种双指针写法,多写一写。随想录给的交换两数的操作也是学到了,除了用temp变量,也可以用异或运算。异或交换没有中间变量。模板看几次就知道了,但是就是不方便阅读。感觉平时做题可以用,写代码最好还是写方便阅读的。

异或交换需要学习一下位运算。异或的规则,对于一堆数里找奇数次方的题非常高效。

class Solution {
    public void reverseString(char[] s) {
        int l = 0;
        int r = s.length - 1;
        while (l < r) {
            s[l] ^= s[r];  //构造 a ^ b 的结果,并放在 a 中
            s[r] ^= s[l];  //将 a ^ b 这一结果再 ^ b ,存入b中,此时 b = a, a = a ^ b
            s[l] ^= s[r];  //a ^ b 的结果再 ^ a ,存入 a 中,此时 b = a, a = b 完成交换
            l++;
            r--;
        }
    }
}

// 第二种方法用temp来交换数值更多人容易理解些
class Solution {
    public void reverseString(char[] s) {
        int l = 0;
        int r = s.length - 1;
        while(l < r){
            char temp = s[l];
            s[l] = s[r];
            s[r] = temp;
            l++;
            r--;
        }
    }
}

2.反转字符串2:代码随想录 (programmercarl.com)

力扣链接:. - 力扣(LeetCode)

没看懂代码,周末复习下,忘记了。


3.替换数字:替换数字 | 代码随想录 (programmercarl.com)

卡码网链接:54. 替换数字(第八期模拟笔试)

这个题不是很难,如果要用库函数那就更容易了,个人觉得for+replace或者正则匹配替换这种都行?所以这个题看能不能用基础代码写出来,了解一下替换的原理,比如Java的替换数字就没法在原数组上操作,必须要新建一个。为什么新建一个,新建大小多少,随想录给的代码操作逻辑是什么。这些都要想一下。

这道题随想录也用了双指针,但是这个写法很巧妙,尤其是j<i的时候,第一次看到没觉得有什么不同,边界而已。但是第二次就想,j和i不是同步减少吗,i一次最多减少5格,为啥可以退出循环。这次再看到是感觉j=i时候就推出循环了,刚好遍历完。

这道题自己也闭卷打代码打了一次,run时候报错了,发现没考虑到j和i的值,还把i--写成j--了,这都是潜意识的东西,但是也反映出对这些的操作理解不深刻。

注意j和i的边界值。注意array是怎么copy的,用法是什么。注意不是数字的情况,一定要记得赋值。

package LuStudy;

public class _8_2ReplaceNumber {
    private static String getReplaceNumber(String s) {
        int countNumber = 0;
        for (int i = 0; i < s.length(); i++) {
            if (Character.isDigit(s.charAt(i))) {
                countNumber++;
            }
        }
        char[] newS = new char[s.length() + countNumber * 5];
        System.arraycopy(s.toCharArray(), 0, newS, 0, s.length());
        for (int i = newS.length - 1, j = s.length() - 1; j < i; j--, i--) {
            if (!Character.isDigit(s.charAt(j))) {
                newS[i] = newS[j];
                continue;
            } else {
                newS[i] = 'r';
                newS[i - 1] = 'e';
                newS[i - 2] = 'b';
                newS[i - 3] = 'm';
                newS[i - 4] = 'u';
                newS[i - 5] = 'n';
                i -= 5;
            }
        }
        return new String(newS);
    }

    public static void main(String[] args) {
        String s = "a1b2c3d";
        System.out.println(getReplaceNumber(s));
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值