代码随想录算法训练营第八天字符串 java :344反转字符串、541 反转字符串II 、151反转字符串里的单词

LeetCode344反转字符串

class Solution {
    public void reverseString(char[] s) {
       int l=0; //左
       int r=s.length-1 ;  //右
       while(r>l)
       {
           char temp =s[l];
           s[l] = s[r];
           s[r] = temp;
          
          l++;
          r--;
       }

    }
}

LeetCode541 反转字符串II

思路

对每两个K里面的对前k字符串进行反转
如果最后剩下的数 凑不出K个 那就将所有都反转
class Solution {
    public String reverseStr(String s, int k) {
        //先生成一个数组
        char[] ch = s.toCharArray();
       // 让数组动起来 每隔2k个就
            for(int i=0;i<ch.length;i+=2*k)
            {
        //在定义 开始 和结束 在结束上进行判断 是否在k以内
                 int start =i;
                 // 判断尾数够不够k个
                 int end= Math.min( ch.length-1,start+k-1);
        //进行reverse 判断
             while(start<end)
             {
                 char temp= ch[start];
                 ch[start] = ch[end];
                 ch[end]  =  temp;

                 start++;
                 end--;
             }
        //最后return  new String (ch);
            }
         return new String(ch);
    }
}

LeetCode 151反转字符串里的单词

思路

  • 移除多余空格
    这里使用快慢指针 用快指针去掉所有空格,再用慢指针加空格 ,出第一个单词除外,单词末尾都要加空;fast遇到空格或者遍历末尾就说明 一个单词结束 ; 最后再将数组的空间重新配置;
  • 双指针反转
    进行合理性判断
if( right>= chars.length)
{
System.out.println(" set a wrong right");
return;
 }

之后在进行 反转就可以了

- 单词反转
start =0 每当end 到了单词末尾后的空格或者是 串尾 就开始反转
if( end = chars.length|| chars[end] == ' '_{
    reverse( chars,startmend-1);
    start=end+1;

AC代码

class Solution {
    public String reverseWords(String s) {
        //生成数组
       char[] chars = s.toCharArray();
        //将多余空格删除  removeCharSpace
          
       chars =removeCharSpace(chars);
    
        // 在将字符反转 reverse
       reverse(chars,0,chars.length-1);   
        //单词反转   reverseEachWords
        reverseEachWords(chars);

       return new String( chars);  

    }
  //定义快指针和慢指针
    public char[] removeCharSpace(char [] chars)
    {
       int slow=0;
       for(int fast=0;fast<chars.length;fast++)   //什么时候减一什么时候不减一
       {
           if(chars[fast]!=' '){

                if(slow!=0)
                 chars[slow++]=' ';
                while(fast<chars.length && chars[fast]!=' ' )
                {
                    chars[slow++] = chars[fast++];
                }


           }
       }
       char [] newchars = new char[slow];
       System.arraycopy (chars,0,newchars,0,slow);
       return newchars;
    }
    //双指针规定范围字符串反转
    public void reverse(char[] chars, int left,int right){
          if(right>=chars.length) //什么时候大于等于
          {
              System.out.println("set a wrong right");
                return;
          }
          while(left<right)
          {
                char temp= chars[left];
                chars[left] = chars[right];
                chars[right] = temp;
                left++;
                right--; 
          }

    }

    public  void reverseEachWords(char[] chars){
        int start=0;
        for(int end=0;end<= chars.length;end++)
        {
            if(end== chars.length|| chars[end]==' ')
            {
                reverse(chars,start,end-1);
                start=end+1;
            }
        }

    }
}

拓展一下

  • 字符串和数组有什么差别,

字符串是若干字符组成的有限序列,也可以理解为是一个字符数组,但是很多语言对字符串做了特殊的规定,接下来我来说一说C/C++中的字符串。

在C语言中,把一个字符串存入一个数组时,也把结束符 '\0’存入数组,并以此作为该字符串是否结束的标志。

小感悟

本来想多写点 这两天欠的有点多 得赶紧补补

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值