Python中的编码风格

时间:2014-02-12 05:59:49

标签: python arrays python-2.7 coding-style hashmap

我最近接受了一家知名硅谷公司的采访。我被要求用O(n)时间复杂度编写以下问题的代码。

问题:

编写一个给定整数数组的函数。如果,它应该返回true 任何值在数组中至少出现两次,如果是,则返回false 每个元素都是不同的。

问题的关键是使用哈希映射。我在python中编写了以下代码:

def containsDuplicate(arr):
    hashi={}
    for i in arr:
        try:
            hashi[i]+=1
            return 1
        except KeyError:
            hashi[i]=1
    return 0

整体访谈进展顺利,我能够找出所有问题的最佳解决方案(有效解决方案)。 后来我从公司收到一封邮件,说我不是这个职位的最佳匹配。当被问及拒绝的原因时,我被告知要编写我的编码风格。

当她说我需要改进我的编码风格时,人力资源意味着什么?为上述问题编写解决方案的最佳方法是什么?

编辑:

再次阅读代码后,我认为甚至不需要hashi[i]+=1。仅return 1就足够了,但我不认为他们仅因我的编码中的这个小错误而拒绝了我。

9 个答案:

答案 0 :(得分:10)

该问题的更简洁的解决方案是:

def has_dups(arr):
    return len(set(arr)) != len(arr)

在集合创建中,任何重复都将被删除,因此计数会告诉我们结果。我认为迭代器中的集合创建是O(n),因此它可以满足该要求。

不能保证这是他们正在寻找的东西!

答案 1 :(得分:4)

检查PEP-8

from collections import defaultdict
def is_duplicate(string):
    freq = defaultdict(lambda: 0)
    for c in string:
        freq[c] += 1
    return all(v == 1 for v in freq.values())

答案 2 :(得分:3)

你会使用“in”而不是try和except。

def containsDuplicate(arr):
    hashi={}
    res = 0    
    for i in arr:
        if i not in hashi:
           hashi[i]=1
        else:
            res = 1
            break
    return res

答案 3 :(得分:2)

可能他们不喜欢你返回0或1而不是False或True的事实。

答案 4 :(得分:2)

尝试对面试拒绝原因进行逆向工程通常是一项困难且通常毫无意义的练习,所以让我们将问题改为更有趣并继续改进你的答案,就像你有更多时间一样。 / p>

编写一个给定整数数组的函数。如果任何值在数组中出现至少两次,它应该返回true,如果每个元素都是不同的,它应该返回false。

def containsDuplicate(arr):
    hashi={}
    for i in arr:
        try:
            hashi[i]+=1
            return 1
        except KeyError:
            hashi[i]=1
    return 0

好吧,python有一个style guide建议一些spacing,所以让我们这样做。 (没有人会因此拒绝某人,顺便说一句)

Python也使用TrueFalse,然后使用C样式0和1来表示布尔值。

def containsDuplicate(arr):
    hashi = {}
    for i in arr:
        try:
            return True
        except KeyError:
            hashi[i] = 1
    return False

现在,Python官方订阅EAFP,你使用异常而不是检查,但有些人不同意。如果您使用了检查,我们有:

def containsDuplicate(arr):
    hashi = {}
    for i in arr:
        if i in hashi:
            return True
        else:
            hashi[i] = True
    return False

然而,时间变得聪明。使用集合,我们可以:

def containsDuplicate(a):
    return len(set(a)) != len(a)

答案 5 :(得分:1)

以下是一些建议。

from collections import defaultdict

def contains_duplicates(arr): # PEP recommends not using camel case
    arr_count = defaultdict(lambda: 0) # you should use defaultdict to specify a default value
    for i in arr:
        arr_count[i] += 1
        if arr_count[i] >= 2:
            return True # Python has a boolean type; you shouldn't use 0s and 1s
    return False

答案 6 :(得分:1)

关于您的样式,您似乎不知道集合的实现与Python中的dicts类似,并且您的代码中不必要地复杂化。我会像Gavin H那样实现它。

此外,您应该使用的其他风格元素(请参阅PEP8):

  • 赋值运算符周围的单个空格
  • 使用下划线分隔名称中的单词而不是驼峰式单词
  • 学习dict方法(您可以使用dict.get方法而不是try / except)
  • 返回True或False,而不是1或0

答案 7 :(得分:1)

您的代码存在许多编码样式问题,但我最不喜欢的是,即使前两个元素相同,它也会始终处理整个数组。

我对此的看法是以下它可能不是最短的,但稍后再回来会更好:

def has_dups(array):
    """ Return true if there are any duplicates in the array """
    result = False  # Return value
    seen = {}  # Dictionary of values seen
    for val in array:
        if seen.get(val, False):
            result = True  # We have a duplicate
            break  # Return NOW
        else:
            seen[val] = True # Add to seen
     return result

在商业组织中,您通常会寻找以下代码:

  1. 符合规范 - 你没有,因为它返回0/1而不是False / True
  2. 符合标准 - 您的标准有几个PEP8问题
  3. 清晰易懂 - 你的内容缺乏评论,并且依赖于例外来节省时间,所以至少要标记你在哪里评论代码是个好主意。
  4. 可测试 - 这意味着一个进入和退出以及低复杂性
  5. 修改

    OP指出他们的代码在我错过的第一个非例外情况下返回 - 这强调了上面的第3点和第4点。

答案 8 :(得分:0)

在这个版本中,我试图让早期的回归显而易见。

def contains_duplicates(arr):
    # returns True if a value of arr occurs more than once
    hashi = {}
    for i in arr:
        if i in hashi:
            return True
        hashi[i] = 1
    return False