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

文章介绍了几种不同的字符串反转方法,包括原地反转数组、按块反转字符串、替换空格以及反转单词。所有方法都采用了双指针技术,对于特殊要求如保留单词顺序等进行了详细处理。

344.反转字符串

本题要求原地修改输入数组,反转问题直接使用双指针。

class Solution {
    /**
    双指针直接拿下
     */
    public void reverseString(char[] s) {
        char temp;
        int left=0;
        int right=s.length-1;
        while(left<right){
            temp=s[left];
            s[left++]=s[right];
            s[right--]=temp;
        }
    }
}

541.反转字符串

本题的要求是每2k个字符将前k个进行反转。首先确定反转的方法使用的是双指针后,然后得看如何对这个数组进行遍历来达到题目中的反转要求。题目的要求是对每2k个字符中的前k进行反转,所以i的递增表达式应该是每次遍历递增2k;接下来的问题就是在i和i+2k这个范围内进行翻转,确定好左右指针即可。

class Solution {
    public String reverseStr(String s, int k) {
        char[] ch = s.toCharArray();
        for(int i = 0;i < ch.length;i += 2 * k){
            int start = i;
            // 判断尾数够不够k个来取决end指针的位置
            int end = Math.min(ch.length - 1,start + k - 1);
            while(start < end){
                
                char temp = ch[start];
                ch[start] = ch[end];
                ch[end] = temp;

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

剑指Offer 05.替换空格

class Solution {
    public String replaceSpace(String s) {
        if(s==null)
            return null;
        StringBuffer sb=new StringBuffer();
        for(int i=0;i<s.length();i++){
            if(s.charAt(i)==' ')
                sb.append("%20");
                else
                    sb.append(s.charAt(i));
        }
        return sb.toString();
    }
}

151.反转字符串里的单词

本题的要求一是单词的顺序要进行反转,而单词内的字母不进行反转,二是反转后的单词序列中单词与单词之间只有一个空格。

为了后面的反转的时间复杂度小一点点,可以选择先进行移除多余空格的操作,这里移除空格的操作利用快慢指针进行,慢指针进行单词的录入,快指针进行原字符串的遍历。

反转单词的操作,可以同个整体的翻转后先将单词置于正确的位置后,再逐个单词反转将各单词内的字母序列还原。

class Solution {
    public String reverseWords(String s) {
        char[] accept=s.toCharArray();
        int start=0;
        int end;
        accept=removerSpace(accept);
        end=accept.length;
        reverse(0,end-1,accept);
        reverseEachWord(accept);
        return new String(accept);

        
    }
    public char[] removerSpace(char[] accept){
        int slow=0;
        for(int fast=0;fast<accept.length;++fast){
            if(accept[fast]!=' '){
                if(slow!=0)
                    accept[slow++]=' ';
                while(fast<accept.length&&accept[fast]!=' ')
                    accept[slow++]=accept[fast++];
            }
        }
        char[] newchar=new char[slow];
        System.arraycopy(accept,0,newchar,0,slow);
        return newchar;
    }
    public void reverse(int start,int end,char[] accept){
        while(start<end){
            
            char temp=accept[start];
            accept[start++]=accept[end];
            accept[end--]=temp;
            
        }
    }
    public void reverseEachWord(char[] accept){
        int left=0;
        for(int right=0;right<accept.length;++right){
            left=right;
            while(right<accept.length&&accept[right]!=' ') ++right;
            reverse(left,right-1,accept);
        }
    }
    
}

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

这一题其实就是上面反转单词中的要求一。

class Solution {
    public String reverseLeftWords(String s, int n) {
        int len=s.length();
        StringBuilder sb=new StringBuilder(s);
        reverseString(sb,0,n-1);
        reverseString(sb,n,len-1);
        return sb.reverse().toString();
    }
     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--;
            }
        }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值