代码随想录day08||344.反转字符串 541. 反转字符串II 剑指Offer 、05.替换空格、151.翻转字符串里的单词、剑指Offer58-II.左旋转字符串

 344.反转字符串

链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

  • 这道题主要学了一下元素swap的操作
    1. 用临时变量交换
      //假设有整型的a,b变量
      int temp=a;
      a=b;
      b=temp;
    2. 用异或运算
      a^=b;
      b^=a;
      a^=b;
    3. a=a+b-(b=a);//用这个算法要注意java里面的数据类型转换
  • 代码:

class Solution {
    public void reverseString(char[] s) {
        int left=0,right=s.length-1;
        while(left<right){
            // s[i]^=s[j];
            // s[j]^=s[i];
            // s[i]^=s[j];
            s[left]=(char)(s[left]+s[right]-(s[right]=s[left]));
        left++;
        right--;
        }
    }
}

 541. 反转字符串II

链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

class Solution {
    public String reverseStr(String s, int k) {
            int len=s.length();
            int left=0;
            char[] arr=new char[len];
            arr=s.toCharArray();
            int right;
        while(left<len){
            while(left+2*k-1<len){
                right=left+k;
                swap(arr,left,right-1);
                left=left+2*k;
            }
            if(left+k-1<len){
                swap(arr,left,left+k-1);
            }else{
                swap(arr,left,len-1);
            }break;

        }
        return String.valueOf(arr);
    }

        public char[] swap(char[] s,int start,int end){
                while(end>start){
                        s[start]^=s[end];
                        s[end]^=s[start];
                        s[start]^=s[end];
                    start++;
                    end--;
                }
                return s;
        }


}

 剑指Offer 05.替换空格

链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

class Solution {
    public String replaceSpace(String s) {
            StringBuffer sb=new StringBuffer();
            //int count=0;


/*第一种直接替换
            for(int i=0;i<s.length();i++){

                if(s.charAt(i)==' '){
                    sb.append("%20");
                }else{
                    sb.append(s.charAt(i));
                }
            }
            return String.valueOf(sb);

*/



        for(int i=0;i<s.length();i++){
                if(s.charAt(i)==' '){
                    //count++;
                    sb.append("  ");
                }
        }
        if(sb.length()==0) return s;
        int left=s.length()-1;
        s=s+sb;
        int right=s.length()-1;
        char arr[]=s.toCharArray();
        while(left>=0){
            if(arr[left]==' '){
                arr[right]='0';
                arr[right-1]='2';
                arr[right-2]='%';
                left--;
                right-=3;
            }else{
                arr[right--]=arr[left--];
            }}

return String.valueOf(arr);

    }
}

 151.翻转字符串里的单词

链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

  • 两种算法,一种是直接new一个新的字符串,然后for循环,遇到空格就改成'%20',再加到新的字符串里。
  • 另一种是用指针
class Solution {
    public String reverseWords(String s) {

            //先把所有的都反转。
            //新建一个stringbuffer ,往后append();
            //然后左指针指向第一个不为' '的元素,右指针指向后面第一个为' '的元素。
                    //如果左指针i指到了s.length(),说明从上次的j到s.length()全是空格,退出循环。
                    //如果右指针j指向了s.length() 说明从i->j-1都不是空格
            //把i,j之间的元素都反转。
            //用之前的str+反转后的字符。
            int left=0;
            int right=-1;
            StringBuffer sb=new StringBuffer();
            s=reverseWord(s,0,s.length()-1);
            while(left<s.length()){
                    while(left<s.length()&&s.charAt(left)==' '){
                        left++;//指向第一个不为空的元素或者指向了空串的最后一个
                    }
                    if(sb.length()!=0&left < s.length()){
                        sb.append(' ');
                    }
                    right=left;
                    while(right<s.length()&&s.charAt(right)!=' '){
                        right++;
                    }//指向下一为空的元素。
                    if(left<right){
                        sb.append(reverseWord(s,left,right-1));
                    }
                    left=right;

            }
            return sb.toString();

    }



    public String reverseWord(String temp,int i,int j){
            char[] arr=temp.toCharArray();
            int start=i;
            int end=j;
            while(j>i){
                arr[i]^=arr[j];
                arr[j]^=arr[i];
                arr[i]^=arr[j];
                j--;
                i++;
            }
        String tt=String.valueOf(arr);
        return tt.substring(start, end+1);

    }
}

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

链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

class Solution {
    public String reverseLeftWords(String s, int n) {
        s=reverseWord(s,0,n-1);
        s=reverseWord(s,n,s.length()-1);
        s=reverseWord(s,0,s.length()-1);
        return s;

    }

    public String reverseWord(String s,int start,int end){
            char[] arr= s.toCharArray();
            while(end>start){
                arr[start]^=arr[end];
                arr[end]^=arr[start];
                arr[start]^=arr[end];
                end--;
                start++;
            }
        return String.valueOf(arr);

            

    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值