算法小知识-------02·02-------双指针(三)

107 阅读2分钟

这是我参与2022首次更文挑战的第10天,活动详情查看:2022首次更文挑战

双指针的巩固训练第三天

反转字符串

该题出自力扣的344题 — 反转字符串【简单题】

审题

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

  • 题意相对简单,就是把一个字符串里面的字符反转,并且不需要开辟额外的空间
  • 根据题意,使用双指针实现
    • 直接一个while循环,指针指向字符串的首尾字符
    • 字符对调
    • 指针相对移动,直到指针碰撞为止

编码

    public void reverseString(char[] s) {
       int n = s.length,left =0,right = n -1;
        while(right>left){
            char c = s[left];
            s[left] = s[right];
            s[right] = c;
            left++;
            right--;
        }
    }

image.png

反转字符串的单词III

该题出自力扣的557题 —— 反转字符串的单词III【简单题】

审题

给定一个字符串 s ,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。

  • 此题与上一题的区别在于,上一题是简单反转一个字符串;而这一题是反转一串字符串所组成的字符串。
  • 需要注意的点是,字符串内需要用空格 隔来
  • 也是使用双指针的方式解决
    • 先用String的split方法分割字符串
    • for循环对于每个数组拆分
    • 延续上题解法,对每个字符串操作
    • 最后用一个for循环遍历,用StringBuilder的append方法去拼接

编码

    public String reverseWords(String s) {
        String[] a = s.split(" ");
        for (int i = 0;i<a.length;i++){
            char[] c = a[i].toCharArray();
            int n = c.length,left =0,right = n -1;
            while(right>left){
                char temp = c[left];
                c[left] = c[right];
                c[right] = temp;
                left++;
                right--;
            }
            a[i] = String.valueOf(c);
        }
        StringBuilder sb = new StringBuilder();
        for(int i =0;i<a.length;i++){
            if (i == a.length - 1){
                sb.append(a[i]);
                break;
            }
            sb.append(a[i]);
            sb.append(" ");
        }
        
        return sb.toString();
    }

image.png