搜索从某个前缀开始的列表元素的函数的O(n)难度是多少?

时间:2019-04-03 17:33:59

标签: python python-3.x

我编写了以下代码,该代码应该找到以某些前缀开头的列表中的所有元素,面试官问代码有O()难度,我回答了O(n),其中n是元素数在清单中,由于招聘人员非常失望,在我看来这是错误的答案。正确的答案是什么,为什么?

def count_elemets(list_elements, prefix):
    result = []
    for i in list_elements:
        if i.startswith(prefix):
            result.append(i)
    return result

正确的答案是什么,为什么?

2 个答案:

答案 0 :(得分:2)

我已经看过startswith函数的实现。

有几点需要考虑。首先,for循环为O(n),匹配的字符数(比方说k)使复杂度为O(k * n)(仍可以视为O(n))。

另一点是,似乎startswith函数可以将tuple作为前缀参数,如果存在元组中的任何前缀(从该前缀开始),则将其返回True。因此,有人可能会说前缀元组的大小也很重要。

但是,这些全都可以视为O(n),我不知道您的面试官是否要求更具体的答案,但我认为他应该更好地解释答案中您的确切要求。 / p>

如果您想看一下,这里是实现。

static PyObject *
unicode_startswith(PyObject *self,
                   PyObject *args)
{
    PyObject *subobj;
    PyObject *substring;
    Py_ssize_t start = 0;
    Py_ssize_t end = PY_SSIZE_T_MAX;
    int result;

    if (!stringlib_parse_args_finds("startswith", args, &subobj, &start, &end))
        return NULL;
    if (PyTuple_Check(subobj)) {
        Py_ssize_t i;
        for (i = 0; i < PyTuple_GET_SIZE(subobj); i++) {
            substring = PyTuple_GET_ITEM(subobj, i);
            if (!PyUnicode_Check(substring)) {
                PyErr_Format(PyExc_TypeError,
                             "tuple for startswith must only contain str, "
                             "not %.100s",
                             Py_TYPE(substring)->tp_name);
                return NULL;
            }
            result = tailmatch(self, substring, start, end, -1);
            if (result == -1)
                return NULL;
            if (result) {
                Py_RETURN_TRUE;
            }
        }
        /* nothing matched */
        Py_RETURN_FALSE;
    }
    if (!PyUnicode_Check(subobj)) {
        PyErr_Format(PyExc_TypeError,
                     "startswith first arg must be str or "
                     "a tuple of str, not %.100s", Py_TYPE(subobj)->tp_name);
        return NULL;
    }
    result = tailmatch(self, subobj, start, end, -1);
    if (result == -1)
        return NULL;
    return PyBool_FromLong(result);
}

https://github.com/python/cpython/blob/master/Objects/unicodeobject.c

答案 1 :(得分:0)

今天好,我收到了我没有通过面试的答案,我要求招聘人员为我提供关于O()的正确答案,然后又得到以下答案:正确的答案就是答案,这表明了足够的理解水平您的代码运行速度的快慢,以确定您是否可以在我们公司工作。您的回答不足以在我们公司工作。

老实说,我希望这不是技术面试官的答案,因为该公司是俄罗斯最大的IT公司之一的分支机构= *(不幸的是,我永远不会从他们那里找到正确的O()观点。

在原始文本: “Правильныйответ - этотакойответ,которыйдемонстрируетдостаточныйдляработывнашейкомпанииуровеньпониманиятого,какбыстроработаетразработаннаявамипрограммаВашответнебылдостаточнымпоэтомукритерию”