代码随想录算法训练营day08_344.反转字符串、541. 反转字符串II、剑指Offer 05.替换空格、51.翻转字符串里的单词、剑指Offer58-II.左旋转字符串

344.反转字符串

题目链接
思路:
1.本题要求用O(1)的空间修改字符串数组,原地修改
2.使用双指针即可,两两原地交换

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

541. 反转字符串II

题目链接
思路:
1.本题在I的基础上难度增加,类似于翻转指定区间,但是每隔2k距离翻转前k个
2.用一个for循环来以2k的距离增加,start和end来固定交换区间
3.注意end的取值**int end = Math.min(start + k - 1, ch.length - 1);**和最后一个元素的位置比较是为了满足题目的条件,如果剩余字符小于k个,end就会取**ch.length - 1**将剩余的全部翻转,否则翻转前k个
4.两两交换元素的方式不止使用temp变量,也可以使用异或操作,简单高效,不需要额外变量

class Solution {
    public String reverseStr(String s, int k) {
        char[] ch = s.toCharArray();
        for (int i = 0; i < ch.length; i += 2*k) {
            int start = i;
            int end = Math.min(start + k - 1, ch.length - 1);
            while (start < end) {
                char temp = ch[start];
                ch[start] = ch[end];
                ch[end] = temp; 
                start++;
                end--;
            }
        }
        return new String(ch);
    }
}

剑指Offer 05.替换空格

题目链接

方式一:直接掉API

思路:
1.使用Java提供的操作字符串的方法replaceAll()

class Solution {
    public String replaceSpace(String s) {
        return s.replaceAll(" ","%20");
    }
}

方式二:常规遍历

思路:
1.遍历字符串即可,遇到空格替换为%20
2.使用StringBuilder来进行新字符串的拼接,遇到空格,拼接%20
3.不是空格则拼接原字符
4.字符串的比较注意使用equals()方法

class Solution {
    public String replaceSpace(String s) {
        if (s == null) {
            return null;
        }
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < s.length(); i++) {
            if (" ".equals(String.valueOf(s.charAt(i)))) {
                sb.append("%20");
            } else {
                sb.append(s.charAt(i));
            }
        }
        return sb.toString();
    }
}

151.翻转字符串里的单词

题目链接
思路:
1.首先用split()方法将字符串以空格分割成字符串数组
2.倒序遍历数组,从最后依次将字符加入字符串
3.如果遇到空格直接跳过
4.注意最后返回要截取0,length-1因为最后会有一个""
为什么要和**""**比较而不是和**" "**比较,在进行debug后,发现前面每多一个空格,分割为字符串后就会多一个空串**""**
image.png
image.png

class Solution {
    public String reverseWords(String s) {
        String[] str = s.split(" ");
        String res = "";
        for (int i = str.length - 1; i >= 0; i--) {
            if (str[i].equals("")) {
                continue;
            } else { 
                res += str[i];
                res += " ";
            }
        }
        return " ".equals(res) ? " " : res.substring(0, res.length() - 1);
    }
}

剑指Offer58-II.左旋转字符串

题目链接

方法一:拼接

这种方法不是原地反转

class Solution {
     public static String reverseLeftWords(String s, int n) {
        String res = "";
        String s1 = s.substring(0, n);
        String s2 = s.substring(n, s.length());
        res = s2 + s1;
        return res;
    }
}

方法二:局部反转和整体翻转

解题具体思路见代码随想录
先反转整体再翻转局部

class Solution {
    public String reverseLeftWords(String s, int n) {
        char[] c = s.toCharArray();
        reverse(c, 0, c.length - 1);
        reverse(c, 0, c.length - 1 - n);
        reverse(c, c.length - n, c.length - 1);
        return new String(c);
    }


    public void reverse(char[] c, int left, int right) {
        while (left < right) {
            c[left] ^= c[right];
            c[right] ^= c[left];
            c[left] ^= c[right];
            left++;
            right--;
        }
    }
}

先反转局部再翻转整体

class Solution {
    public String reverseLeftWords(String s, int n) {
        char[] c = s.toCharArray();
        reverse(c, 0, n - 1);
        reverse(c, n, c.length - 1);
        reverse(c, 0, c.length - 1);
        return new String(c);
    }


    public void reverse(char[] c, int left, int right) {
        while (left < right) {
            c[left] ^= c[right];
            c[right] ^= c[left];
            c[left] ^= c[right];
            left++;
            right--;
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小C卷Java

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

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

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

打赏作者

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

抵扣说明:

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

余额充值