557. 反转字符串中的单词 III【简单】

Mark

  1. String[] str = s.split(" ");直接分割成字符串数组。
  2. 字符串可变语言:
    C/C++, Ruby, PHP, Swift
    
    字符串不可变语言:
    Java, Python, C#, Javascript, Go
    Java可以利用String与StringBuffer之间的转换做到类似可变效果。
    
  3. 在判断条件里应该避免出现循环中的变量。逻辑上可能没问题,在循环中发生变化,会导致意外的情况出现。提前将其算出常量,赋值,作为判断边缘。

题目

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

提示:
     ~~~~      1 <= s.length <= 5 * 104
     ~~~~      s 包含可打印的 ASCII 字符。
     ~~~~      s 不包含任何开头或结尾空格。
     ~~~~      s 里 至少 有一个词。
     ~~~~      s 中的所有单词都用一个空格隔开。

输入:s = “Let’s take LeetCode contest”
输出:“s’teL ekat edoCteeL tsetnoc”

输入: s = “God Ding”
输出:“doG gniD”


使用JavaBuffer类的reverse()方法很容易就搞定了,但是有点耍赖的意思:

class Solution {
    public String reverseWords(String s) {
        String[] str = s.split(" ");
        String result = "";
        for(int i=0; i<str.length; i++){
            String re = new StringBuffer(str[i]).reverse().toString();
            result = result.concat(re).concat(" ");
        }
        return result.trim();
    
    }
}

按照题解所说用额外空间方法完成。

class Solution {
    public String reverseWords(String s) {
        int i = 0, start = 0, finish = 0;
        char[] result = new char[s.length()];
		//
        for(i = 0; i < s.length(); i++){
            if(s.charAt(i) != ' '){//找到空格
                continue;
            }

            finish = i-1;
            while(start < i){
                result[start++] = s.charAt(finish--); 
            }
            result[i] = ' ';
            start = i+1;
        }
        //末尾一个单词的转换
        finish = i-1;
        while(start < i){
            result[start++] = s.charAt(finish--); 
        }

        return String.valueOf(result);
    }
}

卡在这里好半天,只有前几个字符转换进去了,调试半天发现循环次数不够。循环里start是变化的,导致循环次数不正确,循环提前结束,部分位置是\u0000。判断条件应该为常量,一旦有循环中出现的变量,看来很危险的。
在这里插入图片描述
(没有会员没有调试功能只能用这种土办法搞了(#^. ^ #)见笑了)


官方题解的方法二是原地解法,空间复杂度调整为了O(1)。Java的字符串不能改变, 所以实现不了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值