代码随想录算法训练营第8天 | 344.反转字符串 ,541. 反转字符串II,剑指Offer 05.替换空格 ,151.翻转字符串里的单词 ,剑指Offer58-II.左旋转字符串 9.30

代码随想录算法训练营第8天 | 344.反转字符串 ,541. 反转字符串II,剑指Offer 05.替换空格 ,151.翻转字符串里的单词 ,剑指Offer58-II.左旋转字符串 9.30

344.反转字符串

  1. 用双指针 再互相交换值
class Solution {
    public void reverseString(char[] s) {
        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. 可以自己定义reverse函数 对起始和终止索引进行反转
  2. 模拟时,可采用2k 2k的遍历字符串 然后进行反转
  3. 当最后一段字符串不足k个长度时 应直接反转 因此每次满足K个时的反转完 必须加上continue进入下一层循环 以防进入接下来 反转最后不足K个的逻辑
class Solution {
    public void reverse(char ch[],int i,int j){
        while(i<j){
            char temp = ch[i];
            ch[i] = ch[j];
            ch[j] = temp;
            i++;
            j--;
        }
    }


    public String reverseStr(String s, int k) {
        char[] ch = s.toCharArray();
        for(int i = 0; i<ch.length;i+=2*k){
            //当剩余字符>2k或者>k <2k
            if(i+k<=ch.length){         //因为我只关心2k中的前k个
                reverse(ch,i,i+k-1);    //因为i已经指在当前需要反转的第一个字符了 所以不需要+k 只需要+k-1
                continue;
            }


            //当剩余字符<k
            reverse(ch,i,ch.length-1);
        }
        return new String(ch);//将字符数组转成字符串
        

    }
}

剑指Offer 05.替换空格

  1. java遍历字符串常用2种方法
    1. toCharArray()转成字符数组遍历
    2. 用charAt()遍历

创建一个结果字符串往里面添加

  1. 因为String为不可变字符串类型 所以占用内存较大
class Solution {
    public String replaceSpace(String s) {
        char[] ch = s.toCharArray();
        //String res = new String();
        for(int i=0;i<ch.length;i++){
            if(ch[i]==' '){
                ch[]
            }else{
                res+=s.charAt(i);

            }
            


        }
        return res;

    }
}
  1. 用StringBuilder类 可以进行修改拼接等操作 节省内存
  2. 操作即为对数组复制 判断有空格即替换
class Solution {
    public String replaceSpace(String s) {
        //char[] ch = s.toCharArray();
        StringBuilder res = new StringBuilder();
        for(int i=0;i<s.length();i++){
            if(s.charAt(i)==' '){
                res.append("%20");
            }else{
                res.append(s.charAt(i));

            }
            


        }
        return res.toString();

    }
}

151.翻转字符串里的单词

  1. 不使用库函数 空间复杂度为o(1)
  2. 先去除首尾即中间的多余空格
  3. 反转整个字符串
  4. 反转每个单词
  5. 通过自己写方法实现
  6. 删除空格操作类似之前数组中移除元素 可以用双指针 快指针用来获取新的元素 慢指针指向新数组末尾位置
    1. 遇到非空格才处理 即删除所有空格
    2. 除了第一个单词 后面的单词前面都有空格 所以当slow!=0 手动给每个单词前添加空格
    3. 当fast<长度 并且不等于空格时 给slow添加单词
  7. 但是在java中String无法进行数组操作
    1. 删除首尾空格 创建一个StringBuilder类 来接删除空格后的字符串 首先删除首尾空格用while + 判断
    2. 创建removeSpace方法 删除中间多余空格时 判断当前新字符串最后一位是否有空格 || 当前原字符串是否有单词 然后append
    3. 创建reverseString方法 左闭右闭区间内反转字符串 用两端相向双指针实现交换
    4. 创建reverseWord方法 用双指针确定每个单词的首尾位置 调用reverseString方法 反转 end位置即为空格前一个(因为左闭右闭)区间
class Solution {
    public String reverseWords(String s) {
        
        StringBuilder sb =    removeSpace(s);
        reverseString(sb,0,sb.length()-1);
        reverseWord(sb);
        return sb.toString();
        

    }

    public StringBuilder removeSpace(String s){
        StringBuilder sb = new StringBuilder();
        int start = 0;
        int end = s.length()-1;

        //删除首尾空格
        while(s.charAt(start)==' '){
            start++;
        }
        while(s.charAt(end)==' '){
            end--;
        }


        //往sb里面加单词并且每个单词之间只要1个空格
        while(start<=end){
            char c = s.charAt(start);
            if(c!=' ' || sb.charAt(sb.length()-1)!=' '){
                sb.append(c);
            }
            start++;
        }


        return sb;
    }

    public void reverseString(StringBuilder sb,int start,int end){
        //左闭右闭区间内反转字符串
        while(start<end){
            char temp = sb.charAt(start);
            sb.setCharAt(start,sb.charAt(end));
            sb.setCharAt(end,temp);
            start++;
            end--;
        }

    }

    public void reverseWord(StringBuilder sb){
        int start = 0;
        int end = 1;
        int n = sb.length();
        while(start<n){
            while(end<n && sb.charAt(end)!=' '){
               end++;

            }
             reverseString(sb,start,end-1);
             start = end+1;
             end = start+1;
        }
        
    }





}

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

  1. 整体反转+局部反转 定义reverse方法实现
class Solution {
    public String reverseLeftWords(String s, int n) {
        StringBuilder sb = new StringBuilder(s);
        int len = sb.length();
        reverseString(sb,0,len-1);
        reverseString(sb,0,len-1-n);
        reverseString(sb,len-n,len-1);
        return sb.toString();

    }

    public StringBuilder reverseString(StringBuilder sb,int start,int end){
        


        while(start<end){
            char temp = sb.charAt(start);
            sb.setCharAt(start,sb.charAt(end));
            sb.setCharAt(end,temp);
            start++;
            end--;
        }
        return sb;


    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值