代码随想录算法训练营第七天| 344. 反转字符串、541. 反转字符串Ⅱ、卡码网. 54 替换数字

今日内容

  • leetcode. 344 反转字符串
  • leetcode. 541 反转字符串Ⅱ
  • 卡码网. 54 替换数字

Leetcode. 344 反转字符串

文章链接:代码随想录 (programmercarl.com)

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

虽然Java中就有reverse函数可以直接实现对字符串的反转,但这显然不是题目想要考验我们的地方。对于解题时库函数的使用,一般遵循这样的原则:当题目的关键部分可以用库函数直接解决的话,那么就不要用库函数;反之,题目的其他部分可以用库函数解决,且知晓了该函数的实现原理时,则可以使用

本题中,我们采用双指针来反转字符串,具体如下图:

代码如下:

class Solution {
    public void reverseString(char[] s) {
        int start = 0;
        int end = s.length - 1;
        while (start < end){
            char temp = s[start];
            s[start] = s[end];
            s[end] = temp;
            start++;
            end--;
        }
    }
}
  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

Leetcode. 541 反转字符串Ⅱ

文章链接:代码随想录 (programmercarl.com)

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

本题则是添加了几个反转字符串的要求,但是具体的反转操作是不变的。

代码如下:

class Solution {
    public String reverseStr(String s, int k) {
        char[] array = s.toCharArray();
        int end = array.length;
        for (int i = 0; i < end; i += 2 * k){ // 以 2 * k 为单位进行循环
            if (end - i >= k + 1){ // 判断剩余字符数是否大于 k
                reverse(array, i, i + k);
                continue;
            }
            reverse(array, i, end);
        }
        return new String(array);
    }

    public void reverse(char[] s, int i, int k){ // 反转操作
        k = k - 1;
        while (i < k){
            char temp = s[i];
            s[i] = s[k];
            s[k] = temp;
            i++;
            k--;
        }
    }
}
  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

卡码网. 54 替换数字

文章链接:代码随想录 (programmercarl.com)

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

本题给出一个字符串,它由小写字母和数字构成。现在需要将其数字字符替换为‘number’。

思路就是先遍历一遍字符串,得到数字的个数。再新建一个数组,将原有的字母和替换后的内容写入数组。最后将该数组转换为字符串。

代码如下:

public class Main{
    public static void main (String[] args){
        String result = test("a1b2c3");
        System.out.println(result);
    }

    public static String test(String s){
        char[] array = s.toCharArray();
        int count = 0;
        for (int i = 0; i < array.length; i++){ // 遍历字符串,获取数字字符个数
            if (array[i] >= '0' && array[i] <= '9'){
                count++;
            }
        }
        int charLen = array.length - count;
        char[] result = new char[charLen + 6 * count]; // 新建数组
        int end = result.length - 1;
        for (int i = array.length - 1; i >= 0; i--){// 将内容写入新数组中
            if (array[i] >= '0' && array[i] <= '9'){
                result[end--] = 'r';
                result[end--] = 'e';
                result[end--] = 'b';
                result[end--] = 'm';
                result[end--] = 'u';
                result[end--] = 'n';
                continue;
            }
            result[end--] = array[i];
        }
        return new String(result);
    }
}
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

总结

这次内容了解了字符串的反转和替换操作。其中也知道了在解题过程中何时该使用库函数来解决问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DonciSacer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值