代码随想录第八天|344.反转字符串、541.反转字符串、剑指offer5.替换空格、151.翻转字符串中的单词、剑指offer58.左旋转字符串

本文介绍了在LeetCode平台上解决字符串反转、单词反转、空格替换和单词间隔反转等问题的Java解决方案,涉及StringBuilder、StringBuffer和字符串操作技巧。通过实例解析,展示了如何高效地处理字符串和数据结构在这些问题中的应用。
摘要由CSDN通过智能技术生成

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

初见思路:想法很简单,就是通过获取char[]的长度,原地进行交换即可

ac代码如下:

class Solution {
    public void reverseString(char[] s) {
        int length = s.length;
        for(int i = 0; i < s.length / 2;i++){
            char tmp = s[i];
            s[i] = s[length-i-1];
            s[length - i - 1] = tmp;
        }
    }
}

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

思路:简单的进行模拟就好,但要注意:
Java中 String属于引用数据类型,他是不可变的→即从出生到死亡都是不能够改变的

因此本题中我们需要使用StringBuffer对变化后的字符串进行存储
StringBuffer支持动态对字符串进行增删操作
同时本题中用到了许多的String操作,读者若不明白其中原理可自行查阅相关内容

本题就是简单的模拟,笔者在第一次书写时对字符串中的内容进行了修改,发现这是并不可行的,我们应当使用StringBuffer来进行相关操作,具体思路为:

  1. 定义 start、 firstk 以及 secondk 来每次寻找其相关位置,同时对于firstk、 secondk的值判断其是否超出长度
  2. 定义两个StringBuffer对象,用来保存我们修改后的相关字符串
  3. 每次操作后,令start直接+=2k以减少操作
  4. 具体的字符串添加使用 String.substring() 以及 StringBuffer.append()进行

具体ac代码如下:

class Solution {
    public String reverseStr(String s, int k) {
        StringBuffer res = new StringBuffer();
        int length = s.length();
        int start = 0;
        while(start < length){
            StringBuffer temp = new StringBuffer();
            int firstK = ( start + k > length)?length:start+k;
            int secondK = (start + (2 * k) > length)?length:start+(2*k);

            temp.append(s.substring(start,firstK));
            res.append(temp.reverse());

            if(firstK < secondK){
                res.append(s.substring(firstK,secondK));
            }
            start+=(2*k);
        }
        return res.toString();
    }
}

题目链接:剑指 Offer 05. 替换空格 - 力扣(LeetCode)

初见思路:想法很简单,直接遍历整个字符串,遇到空格则在StringBuffer中添加空格前的字符串,并添加所要求的字符串,继续便可。最终添加未加入StringBuffer中的字符串

ac代码如下:

class Solution {
    public String replaceSpace(String s) {
        StringBuffer res = new StringBuffer();

        int temp = 0;
        for(int i = 0; i < s.length();i++){
            if(s.charAt(i) == ' '){
                res.append(s.substring(temp,i));
                res.append("%20");
                temp = i+1;
            }
            
        }
        res.append(s.substring(temp));
    return res.toString();
    }
}

同样也可使用双指针法来求解此道问题,为字符串添加2 * 空格数 个空间 ,其次让一个指针指向旧的字符串长度,另一个指向新字符串的长度,由后向前进行遍历,当旧指针指向空格时,新指针进行%20的替换,直至两个指针位置相同时结束遍历;

由于在Java中,String是引用型变量,其内部不可更改,因此我们不可避免的要使用额外的空间,故此题使用两种方法的空间复杂度是相同的,读者可自行书写双指针代码,笔者此处就不赘述了。


题目链接:151. 反转字符串中的单词 - 力扣(LeetCode)

思路就是很简单的几点:

  1. 首先定义一个flag变量以去除字符串前的空格
  2. 发现空格时,若下一个不是空格则保存,否则不保存

以上两点就完成了对多余空格的删除,并将其保存到了一个新的字符串中,其次就要进行字符串中单词的反转了

  1. 定义temp以保存单词结束位置,由后向前进行遍历,当发现空格时将整个单词加入新的字符串中,并加上空格
  2. return新的字符串

先保存下,虽然不对

class Solution {
    public String reverseWords(String s) {
        StringBuffer res = new StringBuffer();

        int temp = 0;
        boolean flag = false;
        //完成对前导空格和多余空格的去除
        for(int i = 0; i < s.length();i++){
            if(!flag){
                continue;
            }
            if(s.charAt(i) != ' '){
                flag = true;
            }
            if(flag){
                if(s.charAt(i) != ' '){
                    res.append(s.charAt(i));
                }
                while(s.charAt(i) == ' '){
                    if(s.charAt(i+1)!=' '){
                        res.append(s.charAt(i));
                    }
                    else i++;
                }
            }
        }
        return res.toString();d
        StringBuffer end = new StringBuffer();
        temp = res.length();
        for(int i = res.length()-1;i > 0;i--){
            if(res.charAt(i) == ' '){
                end.append(res.substring(i+1,temp));
                temp = i;
            }            
        }
        end.append(res.substring(0,temp));
        return end.toString();
    }
}

问题出在两个方面:

  1. 应该首先进行flag的修改,其次再进行判断相关的操作
  2. 不该在循环中修改i的值
  3. 没有给end中添加空格
    修改后的ac代码:
**class Solution {
    public String reverseWords(String s) {
        StringBuffer res = new StringBuffer();

        int temp = 0;
        boolean flag = false;
        //完成对前导空格和多余空格的去除
        for(int i = 0; i < s.length();i++){
            if(s.charAt(i) != ' '){
                flag = true;
            }
            if(!flag){
                continue;
            }
            else{
                if(s.charAt(i) != ' '){
                    res.append(s.charAt(i));
                }
                else if(s.charAt(i) == ' '){
                    if((i+1) < s.length() && s.charAt(i+1) !=' '){
                        res.append(s.charAt(i));
                    }
                    else continue;
                }
            }
        }
        StringBuffer end = new StringBuffer();
        temp = res.length();
        for(int i = res.length()-1;i > 0;i--){
            if(res.charAt(i) == ' '){
                end.append(res.substring(i+1,temp));
                end.append(" ");
                temp = i;
            }            
        }
        end.append(res.substring(0,temp));
        return end.toString();
    }
    
}**

题目链接:剑指 Offer 58 - II. 左旋转字符串 - 力扣(LeetCode)

没啥好说的,java必然有内存的消耗

class Solution {
    public String reverseLeftWords(String s, int n) {
        StringBuffer res = new StringBuffer();
        for(int i = n; i < s.length();i++){
            res.append(s.charAt(i));
        }
        res.append(s.substring(0,n));
        return res.toString();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值