08打卡 字符串01

文章讲述了如何使用Java实现字符串的反转操作,包括原地反转字符数组和单词反转,以及利用ASCII码特性进行数字替换。通过指针技巧优化空间复杂度,还讨论了处理字符串中空格的问题。
摘要由CSDN通过智能技术生成

​​​​​​L0344. 反转字符串

思路分析

本题如果使用暴力方法的话就是把整个string转成char数组,然后再倒着遍历出来,但是题目中的描述是必须原地修改输入数组,这时其实可以想到用指针的做法实现,也就是使用左右两个指针进行首尾的交换。

代码实现

得到这个思路之后代码实现就已经很简单了。

   public void reverseString(char[] s) {
        int left = 0;
        int right = s.length - 1;
        char temp;
        while(left < right){
            temp = s[left];
            s[left] = s[right];
            s[right] = temp;
            left++;
            right--;
        }
    }

L0541. 反转字符串 II

思路分析

在上一题中,其实也是翻转left和right之间的字符串,只不过上面的题目的left和right正好是边界。

这一题本来想用双指针每次left和right移动2*k的长度,但是移动之后还要判断剩下的长度。看了题解发现,学习到了一种新的for循环的方式

代码实现

这里每次for循环的时候,不再是i++,而是直接加上一个步长。

 public String reverseStr(String s, int k) {
        int n = s.length();
        char[] chars = s.toCharArray();
        for (int i = 0; i < n; i += 2 * k) {
            reverseString(chars, i, Math.min(i + k, n) - 1);
        }
         return new String(chars);
    }

    // 反转left到right范围内的字符串
    public void reverseString(char[] s, int left, int right) {
        char temp;
        while (left < right) {
            temp = s[left];
            s[left] = s[right];
            s[right] = temp;
            left++;
            right--;
        }
    }

54. 替换数字

思路分析

本题是卡码网的题目,具体的代码实现思路不算麻烦,使用ASCLL码的特点,依次遍历字符串中的每一个字符,当 'c' - 0 <  10 的时候,说明c一定是数字字符,对齐进行替换即可。

代码实现

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String inputString = scanner.nextLine();
        replace(inputString);

    }
    public static void replace(String s) {
        String number = "number";

        char[] chars = s.toCharArray();
        StringBuilder stringBuilder = new StringBuilder();
        for (char c:
             chars) {
            if ((c-'0')<10){
                stringBuilder.append(number);
            }
            else {
                stringBuilder.append(c);
            }
        }
        System.out.println(stringBuilder);

    }

L0151. 反转字符串中的单词

思路分析

个人思路就是把整个长字符串用空格分开,然后对拆开的字符串进行翻转。需要注意因为存在多个空格所以直接拆开之后的字符串存在一些问题。

String S = " A BB  CCC   DDDD    ";
String[] s = S.split(" ");
System.out.println(Arrays.toString(s));

输出的结果为

[, A, BB, , CCC, , , DDDD]

可以看到切割之后的字符串数组会有问题:①有空串  ②字串前可能有空格  ③字串后可能有空格。

所以需要在遇到空串时进行跳过,同时在对每个字串进行翻转前进行处理。

代码实现

 public String reverseWords(String s) {
        String[] strings = reverseWordsFun(s);
        StringBuilder stringBuilder = new StringBuilder();
        for (String ss : strings) {
            if (ss.length() > 0) {
                stringBuilder.append(deleteSpaces(ss));
                stringBuilder.append(" ");
            }
        }
             stringBuilder.deleteCharAt(stringBuilder.length() -1);
        return stringBuilder.toString();

    }

    public String deleteSpaces(String s) {
        int left = 0, right = s.length() - 1;
        // 去掉字符串开头的空白字符
        while (left <= right && s.charAt(left) == ' ') {
            ++left;
        }

        // 去掉字符串末尾的空白字符
        while (left <= right && s.charAt(right) == ' ') {
            --right;
        }
        return s.substring(left, right + 1);
    }

    public String[] reverseWordsFun(String s) {
        String[] words = s.split(" ");

        int left = 0;
        int right = words.length - 1;
        String temp = "";

        while (left < right) {

            while (left < right && words[left].isEmpty()) {
                left++;
            }

            // 移动 right 指针直到找到一个非空字符串为止
            while (left < right && words[right].isEmpty()) {
                right--;
            }
            temp = words[left];
            words[left] = words[right];
            words[right] = temp;
            left++;
            right--;
        }
        return words;
    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值