我正在尝试解决Pramp上的问题:
实现一个函数reverseWords,以最有效的方式反转数组中单词的顺序。
例如:arr = [' p',' e'' r',' f',' e&# 39;,' c',' t',' &#39 ;, ' m'' a',''' e'' s',' &#39 ;, ''' r',' a',' c',' t',' i& #39;,' c',' e' ]
输出:[' p',' r',' a',' c',' t' ,'我' c',' e',' &#39 ;, ' m'' a',''' e'' s',' &#39 ;, ' p','''' f',' e',' c& #39;,' t' ]
他们给出的类似Python的伪代码如下:
function reverseWords(arr):
# reverse all characters:
n = arr.length
mirrorReverse(arr, 0, n-1)
# reverse each word:
wordStart = null
for i from 0 to n-1:
if (arr[i] == ' '):
if (wordStart != null):
mirrorReverse(arr, wordStart, i-1)
wordStart = null
else if (i == n-1):
if (wordStart != null):
mirrorReverse(arr, wordStart, i)
else:
if (wordStart == null):
wordStart = i
return arr
# helper function - reverses the order of items in arr
# please note that this is language dependent:
# if are arrays sent by value, reversing should be done in place
function mirrorReverse(arr, start, end):
tmp = null
while (start < end):
tmp = arr[start]
arr[start] = arr[end]
arr[end] = tmp
start++
end--
他们说时间复杂度是 O(n),主要是因为他们遍历数组两次,每个项目的操作数量恒定。顺便提一下,我在C ++中使用stringstreams
提出了完全相同的方法,但认为它效率不高!
我认为此代码段的时间复杂度应为 O(mn),其中m
是字符串中的字数,n
是平均字符数每个单词都有字母。之所以如此,是因为我们遍历输入中的所有元素,在最坏的情况下,对于给定的mirrorReverse()
,i
再次访问所有元素以进行反转。
有人可以解释一下吗?谢谢!
答案 0 :(得分:2)
在 O(n)中,n
表示输入的长度(总字符数),而不是单词数量。我怀疑你很困惑因为代码在后一种意义上使用变量n
。
请注意解释:“遍历数组......”。 “数组”由单个字符组成。
实施对我来说似乎有点傻;它的可读性更高:
答案 1 :(得分:-1)
那么,当你获得 O(m * n)时会发生什么?由于 n 无限大, m 部分真的重要吗?大多数算法要复杂得多,并且可以有 O(n + 2log3 * 7n)等等,但这会简化为 O(n ^ 2)因为 n 变得无限大, 2log3 和 7 * n 并不重要。只有 n * n 。