求解 Python 面试题:

2017-07-11 13:33:42 +08:00
 sunhk25

求解 python 面试题:

def solution(A):
    N = len(A)
    result = 0
    for i in xrange(N):
        for j in xrange(N):
            if A[i] == A[j]:
                result = max(result, abs(i - j))
    return result

当数组极大时,效率不好,求如何改??!!

5720 次点击
所在节点    配件
41 条回复
holajamc
2017-07-11 13:49:53 +08:00
这……不永远都是 0 么…
capbone
2017-07-11 13:51:36 +08:00
计算相距最远的两个相等元素?
先用 argsort 返回排序序号,再分组求最大值,应该会高效不少吧?
sunhk25
2017-07-11 13:52:33 +08:00
@capbone 是的,有參考代碼么
sunhk25
2017-07-11 13:53:26 +08:00
@holajamc 0 並不重要,给的数组有一样的值就可以了,关键是算法
capbone
2017-07-11 13:53:45 +08:00
没... 我也只是随便一想给了个大概思路...
braineo
2017-07-11 13:56:41 +08:00
@capbone 记录出现过的 index 呢?不是 1 pass 么
shuson
2017-07-11 13:59:42 +08:00
```
def sol(A):
n = len(A)
for i in range(n):
j = n-1
while j > i:
if A[i] == A[j]:
return j - i
j -= 1
return 0
```
geelaw
2017-07-11 14:03:39 +08:00
用字典和合适的 hash 函数族可以做附加空间 O(n),期望时间 O(n) 的。
用排序可以做附加空间 O(n),时间 O(nlogn) 的。
ZRS
2017-07-11 14:04:24 +08:00
@shuson 这么改复杂度还是 N^2 这个级别的啊...
holyghost
2017-07-11 14:06:16 +08:00
hashmap 记录第一次出现该元素的 index
后面就是更新 max = (currentIndex - index) 了
空间 O(n) 时间 O(n)
shuson
2017-07-11 14:07:01 +08:00
tkpc
2017-07-11 14:08:51 +08:00
V = {}
for i,x in enumerate(A):
if x in V: V[x][1] = i
else: V[x] = [i,i]
print max( (b-a) for a,b in V.itervalues() )
Valyrian
2017-07-11 14:14:15 +08:00
难道不是直接 return max(A) - min(A)
csdreamdong
2017-07-11 14:14:47 +08:00
0 0 我果然还是菜。。真心求问。这题想描述什么问题。
Valyrian
2017-07-11 14:14:51 +08:00
@Valyrian 看错题了。。
yunkchen
2017-07-11 14:18:55 +08:00
import collections

def solution(A):
l_count = collections.Counter(A)
repeats = [k for k, v in l_count.items() if v > 1]
ix_dict = collections.defaultdict(lambda: set())
for i in range(len(A)):
if A[i] in repeats:
ix_dict[A[i]].add(i)
return max([max(ix_value)-min(ix_value) for ix_value in ix_dict.values()])
chroming
2017-07-11 14:29:34 +08:00
一个小优化

'''

def solution(A):
N = len(A)
result = 0
for i in xrange(N):
for j in xrange(i, N):
if A[i] == A[j]:
result = max(result, abs(i - j))
return result

'''
chroming
2017-07-11 14:30:27 +08:00
回复怎么不支持 markdown 了

把 for j in xrange(N)改成 for j in xrange(i, N):
gimp
2017-07-11 14:35:11 +08:00


谁帮我看着这个时间复杂度多少,谢谢
ty89
2017-07-11 14:35:34 +08:00
```

def foo(a):
m = {}
max_delta = 0
for current_index in xrange(len(a)):
s = a[current_index]
if not m.has_key(s):
m[s] = {'first_index':current_index}
delta = 0
else:
delta = abs(m[s]['first_index'] - current_index)

max_delta = max(max_delta, delta)
return max_delta

```

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/374491

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX