把句子中每个词的字符颠倒过来。例如:
我叫亚历克斯
更改为
伊曼希拉
我想到了通常的O(n)时间算法,使用两个指针指向单词的任意一端并将其反转。
但在下面的网站
http://www.businessinsider.com/8-mind-bending-interview-questions-that-google-asks-its-engineers-2012-7?op=1
(参考问题2的答复)
将其转换成链表,并对单个单词重复应用链表反转效果更好。我在hackerreath上找到了相同程序的以下解决方案:
http://learn.hackerearth.com/question/317/reverse-characters-of-each-word-in-a-sentence/
这个解决方案需要O(n)时间和O(n)空间。我建议的解决方案需要O(n)时间O(1)空间第二个怎么样?
以下是Hackerreath的代码:

public node stringReverseChars(node ll){
    if(ll == null || ll.next == null)
        return ll;
    node tmp = ll;
    node head = null, prev = null;
    while(tmp != null){
        while(tmp != null && tmp.data == ' '){
            if(head == null)
                head = tmp;
            prev = tmp;
            tmp = tmp.next;
        }
        if(tmp == null)
            break;
        node curr = tmp;
        while(tmp.next != null && tmp.next.data != ' '){
            tmp = tmp.next;
        }
        node np = tmp.next;
        tmp.next = null;
        node rev = reverseLL(curr);
        if(prev != null)
            prev.next = rev;
        prev = curr;
        curr.next = np;
        if(head == null)
            head = rev;
        tmp = np;
    }
    return head;
}

最佳答案

我很怀疑其他方法是否更好它们的内存使用率(_(n)比o(1))和引用的局部性(它们使用链表而不是数组)更差。我不认为你的解决方案有什么问题;事实上,我认为这是做这件事的标准方法。
希望这有帮助!

08-25 19:41