代码随想录|●151.翻转字符串里的单词●卡码网:55.右旋转字符串●字符串总结 ●双指针回顾

import java.util.Scanner;

public class Day8 {
//    给你一个字符串 s ,请你反转字符串中 单词 的顺序。
//    单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。
//    返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。
//    注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,
//    单词间应当仅用单个空格分隔,且不包含任何额外的空格。
    //1.删除多余空格
    //2.翻转整个字符串
    //3.再次翻转所有单词
    public  static String reverseWords1(String s) {
        char[] str=s.toCharArray();
        str=deleteSpace(str);
        reverse(str,0,str.length-1);
        System.out.println(str.length);
        for(int left=0,right=0;right<=str.length;right++) {
            if((right==str.length)||str[right]==' ') {//right==str.length条件一点要摆在str[right]==' '前面,
                // 不然到串尾部时先判断str[right]==' '时会报错
                reverse(str,left,right-1);
                left=right+1;
            }
        }
        return new String(str);
    }
    //删除空格方法
    public static char[] deleteSpace(char[] chars){
        int slow = 0;
        for (int fast = 0; fast < chars.length; fast++) {
            //先用 fast 移除所有空格
            if (chars[fast] != ' ') {
                //在用 slow 加空格。 单词末尾要加空格
                if (slow != 0)//除第一个单词外
                    chars[slow++] = ' ';
                //fast 遇到空格或遍历到字符串末尾,就证明遍历完一个单词了
                while (fast < chars.length && chars[fast] != ' ')
                    chars[slow++] = chars[fast++];
            }
        }
        //相当于 c++ 里的 resize()
        char[] newChars = new char[slow];
        System.arraycopy(chars, 0, newChars, 0, slow);
        return newChars;

    }
    public static void reverse(char[] s,int i, int k) {//从i开始到k翻转,k最大为s.length-1
        char temp;
        for (; i < k; i++,k--) {
            temp = s[i];
            s[i] = s[k];
            s[k] = temp;
        }
    }
    //方法2:创建一个新char数组,然后将主数组从尾部遍历将单词从尾部正序输入到新的char数组中
    public  static String reverseWords2(String s) {
        char[] str=s.toCharArray();
        char[] newArr=new char[str.length];
        int begin=0,end=str.length-1;
        for(;end>=0;end--){
            if(str[end]!=' '){
                int i=end;
                if(begin!=0)
                    newArr[begin++]=' ';
                while((end>=0)&&(str[end]!=' ')){
                    end--;
                }
                for(int j=end+1;j<=i;j++){
                    newArr[begin++]=str[j];
                }
            }
        }
        char[] newChars = new char[begin];
        System.arraycopy(newArr, 0, newChars, 0, begin);
        return new String(newChars);
    }
//    字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k,
//    请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。
//    例如,对于输入字符串 "abcdefg" 和整数 2,函数应该将其转换为 "fgabcde"。
//只需要翻转再翻转即可
    //先反转整体,在翻转前部串和后部串
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int k = Integer.parseInt(sc.nextLine());
        String s=sc.nextLine();
        char[] chars=s.toCharArray();
        reverse(chars,0,chars.length-1);
        reverse(chars,0,k-1);
        reverse(chars,k,chars.length-1);
        System.out.println(chars);
    }


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值