面试题58:I. 翻转单词顺序

输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. “,则输出"student. a am I”。

方法一:字符串头插

把已经读取到的单词组 words 添加到当前单词 curr 的后面,先在每个单词后面都添加一个空格,最后在删除字符串最后面的一个空格

  • 时间复杂度 O(n)
  • 空间复杂度 O(n)
// 自己写的效率果然不行
// 执行用时:26 ms, 在所有 Java 提交中击败了5.41%的用户
// 内存消耗:39.1 MB, 在所有 Java 提交中击败了25.46%的用户

public String reverseWords(String s) {
    String words = new String();
    boolean first = true;
    for (int i = 0; i < s.length(); i++) {
        // 一次读取一个单词
        String curr = new String();
        while (i < s.length() && s.charAt(i) != ' ') { 
            curr = curr + Character.toString(s.charAt(i));
            i++;
        }
        if (!curr.equals("")) {
            curr = curr + " " + words;
            words = new String(curr);
        }
    }
    if (!words.equals("")) {
        words = words.substring(0, words.length() - 1);
    }
    return words;
}
方法二:倒序双指针法

双指针 i, j 从后往前指向一个单词的首尾,然后再用 substring() 取出这个单词,在单词尾部添加一个 " ",再加入到结果集 StringBuilder 中

s.trim() 是真的好用,可以去除首尾的空格,方法一就可以简单很多

  • 时间复杂度 O(n)
  • 空间复杂度 O(n)
public String reverseWords(String s) {
    s.trim(); // 删除首尾空格
    int i = s.length() - 1, j = i;
    StringBuilder res = new StringBuilder();
    while (i >= 0) {
        while (i >= 0 &&s.charAt(i) != ' ') {
            i--;
        }
        res.append(s.substring(i + 1, j + 1) + " ");
        while (i >= 0 && s.charAt(i) == ' ') {
            i--;
        }
        j = i;
    }
    return res.toString().trim();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值