0
点赞
收藏
分享

微信扫一扫

反转字符串总结

斗米 2022-02-02 阅读 104

反转字符串总结

1.反转字符串

在这里插入图片描述

反转字符串

class Solution {
    public void reverseString(char[] s) {
        int left=0;
        int right =s.length-1;

        //快慢指针交换首位
        while(left<right){//利用了a^b^b=a这一特性
            s[left]^=s[right];
            s[right]^=s[left];
            s[left]^=s[right];
            left++;
            right--;
        }
    }
}

2.反转字符串 II

在这里插入图片描述
反转字符串 II

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){
                ch[start] ^= ch[end];
                ch[end] ^= ch[start];
                ch[start] ^= ch[end];
                start++;
                end--;
            }
        }
        return new String(ch);
    }
}

3.替换空格

在这里插入图片描述
替换空格

class Solution {
    public String replaceSpace(String s) {
        StringBuilder sb =new StringBuilder();
        if(s==null) return null;

        for(int i=0;i<s.length();i++){
            //如果当前字符串时空格
            if(" ".equals(String.valueOf(s.charAt(i)))){//注意将char类型转换位String类型
               sb.append("%20");//将此位置添加为%20
            }else{
                sb.append(s.charAt(i));
            }
            
        }
        return sb.toString();//注意:输出String类型,要将StringBuilder转换为String
    }
}

4.翻转字符串里的单词

在这里插入图片描述
翻转字符串里的单词

class Solution {
    /**
      1.去掉空格(在前面、后面或者单词间包含多余的空格)
      2.反转字符串
      3.反转单词
     */
    public String reverseWords(String s) {
        StringBuilder sb= removeSpace(s);
        reverseString(sb,0,sb.length()-1);
        reverseEachWoed(sb);
        return sb.toString();
    }


    //去掉空格
    private StringBuilder removeSpace(String s){
        StringBuilder sb =new StringBuilder();
        int left =0;
        int right = s.length()-1;
        while(s.charAt(left)==' ') left++;//从前面去空格
        while(s.charAt(right)==' ') right--;//从后面去空格
        //去掉中间的空格
        while(left<=right){
            char ch = s.charAt(left);
            if(ch!=' '||sb.charAt(sb.length()-1)!=' '){//核心代码
                sb.append(ch);
            }
            left++;
        }
        return sb;
    }


    //反转字符串
    private void reverseString(StringBuilder sb,int left,int right){
        while(left<right){
            char temp =sb.charAt(left);//临时存储
            sb.setCharAt(left,sb.charAt(right));//将字符串中指定的位置的字符替换成目标字符
            sb.setCharAt(right,temp);//将字符串中指定的位置的字符替换成目标字符
            left++;
            right--;
        }
    }

    //反转单词
    private void reverseEachWoed(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;
        }
    }
}

5.左旋转字符串

在这里插入图片描述
左旋转字符串

class Solution {
    /**
        1.先局部反转(前n项) 
        2.再反转剩余的
        3.再全体反转   
     */
    public String reverseLeftWords(String s, int n) {
        StringBuilder sb =new StringBuilder(s);
        int right=s.length()-1;
        
        reverseString(sb,0,n-1);
        reverseString(sb,n,right);
        return sb.reverse().toString();


    }


    /**
       反转字符串
     */
    private void reverseString(StringBuilder sb,int left,int right){
        while(left<right){
            char temp = sb.charAt(left);//暂时存储当前第一个位置的字符
            sb.setCharAt(left,sb.charAt(right));
            sb.setCharAt(right,temp);
            left++;
            right--;
        }
       
    }
}
举报

相关推荐

0 条评论