代码随想录字符串part01

目录

 今日学习的文章

反转字符串 

看到题目的第一想法

看到代码随想录之后的想法

自己实现过程中遇到的困难

反转字符串II(需要再研究一下)

看到题目的第一想法

看到代码随想录之后的想法

自己实现过程中遇到的困难

翻转字符串里的单词 

看到题目的第一想法

看到代码随想录之后的想法

自己实现过程中遇到的困难


 今日学习的文章

反转字符串 

建议: 本题是字符串基础题目,就是考察 reverse 函数的实现,同时也明确一下 平时刷题什么时候用 库函数,什么时候 不用库函数 

题目链接/文章讲解/视频讲解:代码随想录

看到题目的第一想法

     用双指针

看到代码随想录之后的想法

          for循环 从前往后遍历,利用数组特性,直接进行值的交换,for循环只走一半
    

自己实现过程中遇到的困难

      s[i] 对应s[s.length-i-i]

      Java有特定的方式 使用StringBuilder方法        

         利用StringBuilder.setCharAt(int index,char c);可以对index位置进行值的修改

             

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

反转字符串II(需要再研究一下)

建议:本题又进阶了,自己先去独立做一做,然后在看题解,对代码技巧会有很深的体会。 

题目链接/文章讲解/视频讲解:代码随想录

看到题目的第一想法

    双指针,每次i走一个,j走两个,走k步,然后i之前的进行反转

看到代码随想录之后的想法

         因为是数组,i可以直接走2K步,然后反转之前的K个
                    

自己实现过程中遇到的困难

           是否要处理最后一段元素?

        每次进循环的时候判断

           当i+k<=length时候就直接反转i--i+k-1

           当i+k>length时候就反转剩余的

class Solution {
    public String reverseStr(String s, int k) {
        //我的想法,三个指针i,j,z, i走一步,j走两步,直到k步后处理前k个也就是z~i这一段,
        //然后令i=2k,z=2k再往后走相同的步骤
        //代码随想录做法完全没有这么复杂,直接让i每次走2k步,然后处理前k步的char,最后再另外讨论
        char[] c = s.toCharArray();

        for(int i=0;i<c.length;i=i+2*k){
            //处理前k个
            //剩余字符大于k个
            if(i+k<=c.length){
                reverse(i,i+k-1,c);
                continue;
            }            
            //剩余字符小于K个
            reverse(i,c.length-1,c);
        }
        return new String(c);
    }
    void reverse(int i,int j ,char[] s){
        //ij互换
        while(i<j){
            char temp = s[i];
            s[i] = s[j];
            s[j] = temp;
            i++;
            j--;
        }
    }
}

翻转字符串里的单词 

建议:这道题目基本把 刚刚做过的字符串操作 都覆盖了,不过就算知道解题思路,本题代码并不容易写,要多练一练。 

题目链接/文章讲解/视频讲解:代码随想录

看到题目的第一想法

    弄个新数组,然后放进去,但也没实现

看到代码随想录之后的想法

        1 先把字符串去除空格(首尾和中间的空格)

        2 整体进行一个反转

        3 对单词进行一个反转

自己实现过程中遇到的困难

           1 去除空格没思路

           2 整体反转用StringBuilder

           3 对单词进行一个反转 注意指针的走向

class Solution {
    public String reverseWords(String s) {
        //我的思路左右双指针,找空格,但是有个问题,单词的下标长度不一样
        // 可以用一个新数组,左边的放右边,右边的放在左边
        //char[] c1 = s.toCharArray();
        //char[] c2 = new char[s.length];
        // 设置双指针,将c1右边的单词放到c2左边,c1左边的单词放到右边
        //int i = 0;
        //int j = c1.length;
        //int size;
        //用一个新数组

        //卡哥思路只能用o(1)的空间复杂度
        //1 移除多余的空格 ,先移除前缀和后缀的空格,再移除中间多余的空格,其中有个判断,当c!=' '||sb.charAt(sb.length-1)!=' '
        //C不为空或c的最后一位不为空 若遇到空,发现c的最后一位不为空,就补个空上去
        //2 移除空格后数组反转 sb.setCharAt(index,string) 进行一前一后的交换
        //3 反转后,每个单词反转 双指针,找到单词,进行反转,再往后走,记得最后一个单词也要反转,所以start指针要走完
        //while(end<n&&sb.charAt(end)!='') end++;交换后start=end+1,end=start+1
        //1 移除多余的空格 StringBuilder的用法不熟练
        StringBuilder sb = new StringBuilder("");
        //一个空的StringBuilder
        //遍历String数组,如果为" "则不append,如果不为" "则append
        //sb.setCharAt(index,string)把index设为String值
        //前缀为空则++,后缀为空则--
        int i = 0;
        int j = s.length()-1;
        while(s.charAt(i)==' '){
            i++;
        }
        while(s.charAt(j) == ' '){
            j--;
        }
        while(i<=j){
            char c = s.charAt(i);
            //c不为空或者sb的最后一位不为空(代表单词之间需要加上一位' ',而之后的' '不要)
            if(c!=' '||sb.charAt(sb.length()-1)!=' '){
                sb.append(s.charAt(i));
            }
            i++;
        }





        //移除数组后的反转
        //sb.setCharAt(index,string);
        //双指针,
        reverseString(0,sb.length()-1,sb);

        //反转后每个单词反转
        reverseEachWord(sb);
        return sb.toString();
    }
    public void reverseString(int start,int end,StringBuilder sb){
        while(start<end){
            char temp = sb.charAt(start); 
            sb.setCharAt(start,sb.charAt(end));
            sb.setCharAt(end,temp);
            start++;
            end--;
        }
    }       
      private void reverseEachWord(StringBuilder sb) {
          //快慢指针法,用start和end
          //end每次往后走,走到' '时候,end到start之间进行反转,然后start=end+1,end=start+1再走
            int start = 0;
            int end = 1;
            int length = sb.length();
            while(start<length){
                /*if(sb.charAt(end)==' '){
                    reverseString(start,end-1,sb);
                    start = end+1;
                    end = start+1;
                }*/
                //因为要处理最后一个所以要这么写
                while(end<length&&sb.charAt(end)!=' '){
                    end++;
                }
                reverseString(start,end-1,sb);
                start = end+1;
                end = start+1;
                
            }
       }
}

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值