代码随想录DAY09|151.翻转字符串里的单词 、卡码网:55.右旋转字符串|待补充

1. 翻转字符串里的单词

力扣

分为以下几个步骤

  1. 去除多余空格
  2. 翻转整个字符串
  3. 翻转每个单词

要注意以下细节:

  • 去除空格:用快慢指针法,首先快指针去除空格,在所有非空格位置进行处理。然后首先加空格。慢指针在除了第一个单词之前加上空格。**这样保证单词间有空格且在每个单词前。**加完空格就快慢指针把单词加进去,循环就可以了。
  • 翻转整个字符串:参数要设置开头结尾的位置,因为下面的函数要用
  • 翻转每个单词:也是快慢指针,快指针的判断条件是
 for(int end = 0; end <= chars.length; end++){
            if(end == chars.length || chars[end] == ' '){
                reverse(chars,start,end -1);
                start = end + 1;
            }
        }

因为要处理的是start到end前面一个,所以最外层要加=。

class Solution {
    public String reverseWords(String s) {
        char[] chars = s.toCharArray();
        chars = removeExtraSpaces(chars);
        reverse(chars,0,chars.length - 1);
        reverseEachWord(chars);
        return new String(chars);
    }

    public char[] removeExtraSpaces(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 start, int end){
        for(; start <= end; start++,end--){
            char temp = chars[start];
            chars[start] = chars[end];
            chars[end] = temp;
        }
    }

    public void reverseEachWord(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;
            }
        }
    }
}

2. 右旋字符串

在原位置操作,先整体翻转,然后翻转前n个,再翻转后len-n个。

import java.util.Scanner;

public class Main{
    public static String rotateString(int n, String str){
        char[] chars = str.toCharArray();
        reverse(chars,0, chars.length - 1);
        reverse(chars,0, n - 1);
        reverse(chars, n, chars.length - 1);
        return new String(chars);
    }
    
    public static void reverse(char[] chars, int start, int end){
        for(;start < end; start++, end--){
            char temp = chars[start];
            chars[start] = chars[end];
            chars[end] = temp;
        }
    }
    
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int n = Integer.parseInt(sc.nextLine());
        String str = sc.next();
        String s = rotateString(n,str);
        System.out.println(s);
    }
}

3.待补充

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值