反转字符串中的单词 III(No.13)

题目描述

给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。

示例:
输入:"Let's take LeetCode contest"
输出:"s'teL ekat edoCteeL tsetnoc"

解题历程

第一次

class Solution {
    public String reverseWords(String s) {
        int i=0;
        String result="";
        String[] ch = s.split(" ");
        while(i<ch.length){
            result += change(ch[i].toCharArray())+" "; //将ch[i]转化为char[]类型传入函数
            i++;
        }
        result = result.substring(0, result.length() - 1);//删除最后一个空白字符
        return result;
    }
    //部分字符翻转 遍历
    public String change(char[] str){
         int left =0 ,right = str.length-1;
        while ( left <= right ){
            char temp = str[ left ]; 
                str [ left ]= str [ right ];
                str [ right ]= temp ;
                 left ++;
                 right --;
         }
        return String.valueOf(str); //将char[]转化为String类型返回
    }
}

思路二

直接在原字符串上进行操作,避免额外的空间开销。
当找到一个单词的时候,我们交换字符串第一个字符与倒数第一个字符,
随后交换第二个字符与倒数第二个字符……
如此反复,就可以在原空间上翻转单词。

需要注意的是,原地解法在某些语言(比如 Java,JavaScript)中不适用,因为在这些语言中 String 类型是一个不可变的类型。

方法三(极佳)

class Solution {
    public String reverseWords(String s) {
        char[] chars = s.toCharArray();
        int l = chars.length;
        int startIndex= 0;
        int endIndex = 0;
        while (endIndex < l && startIndex < l){
            int endValue = chars[endIndex];
            if (endValue == ' ') {
                reverseString(chars,startIndex,endIndex - 1);
                startIndex = endIndex + 1;
                endIndex++;
            }
            endIndex++;
        }
        reverseString(chars,startIndex,endIndex - 1);
        return new String(chars);
    }
    public void reverseString(char[] s,int start,int end) {
        char temp;
        int l = end - start;
        int flg = (l - l % 2) / 2;
        for (int i = 0; i <= flg; i++) {
            temp = s[start + i];
            s[start + i] = s[start + l - i];
            s[start + l - i] = temp;
        }
    }
}

总结

1.str.toCharArray()将String类型的str转化为char[]类型
2.String.valueOf(str)将char[]类型的str转化为String类型
3.str= str.substring(0, str.length() - 1)去除String类型str的最后一个字符

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值