【剑指 Offer 题解】58.1 翻转单词顺序列

题目

牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?

思路

1、直接解决,每个单词空格分隔,将每个单词倒着拼接起来。

public String reverseSentence(char[] chars) {
	String str = new String(chars);
	if ("".equals(str.trim()))
		return str;
	String[] worlds = str.split(" ");
	StringBuilder builder = new StringBuilder();
	for (int i = worlds.length - 1; i >= 0; i--) {
		builder.append(worlds[i]);
		if (i != 0) {
			builder.append(" ");
		}
	}
	return builder.toString();
}

2、若题目中添加 “不使用额外的空间” 的条件。

  • 可以使用两次翻转,先反转整个字符串的顺序,然后再逐个反转单词的顺序。
public String ReverseSentence(char[] chars) {
        // 翻转整个字符串
        reverse(chars, 0, chars.length - 1);
        int worldStartIndex = 0;// 一个单词的起始下标
        int curIndex = 0; // 当前字符下标
        while (curIndex <= chars.length) {
            // 当前字符为空格,或最后一个字符,反转前一个单词
            if (curIndex == chars.length || chars[curIndex] == ' ') { 
                reverse(chars, worldStartIndex, curIndex - 1);
                worldStartIndex = curIndex + 1;
            }
            curIndex++;
        }
        return new String(chars);
    }
    // 反转从start到end的字符
    private void reverse(char[] chars, int start, int end) {
        for (int i = start, j = end; i < j; i++, j--) {
            swap(chars, i, j);
        }
    }
    // 交换chars[i] chars[j] 
    private void swap(char[] chars, int i, int j) {
        char temp = chars[i];
        chars[i] = chars[j];
        chars[j] = temp;
    }
发布了18 篇原创文章 · 获赞 0 · 访问量 506

猜你喜欢

转载自blog.csdn.net/qingqingxiangyang/article/details/104314989