当前位置: 首页 > 知识库问答 >
问题:

给定一个由一百万个数字组成的字符串,返回所有重复的3位数字

龚睿
2023-03-14

几个月前,我参加了纽约一家对冲基金公司的面试,不幸的是,我没有得到数据/软件工程师的实习机会。(他们还要求解决方案使用Python。)

我在第一个面试问题上搞砸了...

123 - 3 times
234 - 3 times
345 - 2 times

000-->999

现在我在考虑,我认为不可能想出一个常数时间的算法。是吗?

共有1个答案

萧奇
2023-03-14

你轻松地离开了,你可能不想为一个量化员不懂基本算法的对冲基金工作:-)

O(1)中,如果您需要至少访问每个元素一次,则无法处理任意大小的数据结构。在本例中,O(n)是最好的选择,其中n是字符串的长度。

不过,顺便说一句,对于固定的输入大小,名义上的O(n)算法将是O(1),所以从技术上讲,它们在这里可能是正确的。然而,人们通常不是这样使用复杂性分析的。

其次,通过提供Pythonic代码来展示您的精英技能,例如:

inpStr = '123412345123456'

# O(1) array creation.
freq = [0] * 1000

# O(n) string processing.
for val in [int(inpStr[pos:pos+3]) for pos in range(len(inpStr) - 2)]:
    freq[val] += 1

# O(1) output of relevant array values.
print ([(num, freq[num]) for num in range(1000) if freq[num] > 1])

这一产出:

[(123, 3), (234, 3), (345, 2)]

当然,您可以将输出格式修改为您想要的任何格式。

当然,由于GIL,不在一个Python解释器中,但是您可以将字符串拆分为类似的部分(vv指示的重叠是允许正确处理边界区域所必需的):

    vv
123412  vv
    123451
        5123456

您可以将这些分解出来,以分离员工,然后将结果组合在一起。

输入的拆分和输出的组合可能会用小字符串(甚至可能是百万位数的字符串)淹没任何保存,但对于更大的数据集,这很可能会有所不同。当然,我通常的口头禅“衡量,不要猜测”也适用于这里。

例如,下面的C代码运行在与早期Python代码相同的硬件上,在0.6秒内处理1亿个数字,与Python代码处理100万个数字的时间大致相同。换句话说,快得多:

#include <stdio.h>
#include <string.h>

int main(void) {
    static char inpStr[100000000+1];
    static int freq[1000];

    // Set up test data.

    memset(inpStr, '1', sizeof(inpStr));
    inpStr[sizeof(inpStr)-1] = '\0';

    // Need at least three digits to do anything useful.

    if (strlen(inpStr) <= 2) return 0;

    // Get initial feed from first two digits, process others.

    int val = (inpStr[0] - '0') * 10 + inpStr[1] - '0';
    char *inpPtr = &(inpStr[2]);
    while (*inpPtr != '\0') {
        // Remove hundreds, add next digit as units, adjust table.

        val = (val % 100) * 10 + *inpPtr++ - '0';
        freq[val]++;
    }

    // Output (relevant part of) table.

    for (int i = 0; i < 1000; ++i)
        if (freq[i] > 1)
            printf("%3d -> %d\n", i, freq[i]);

    return 0;
}
 类似资料:
  • 给定一个字符串数组,单词,返回该数组,其中包含所有偶数长度的字符串,并将其替换为空字符串。 如何返回字符串?我需要返回字符串以便为偶数打印空白,但现在我只是返回一个计数。这是我的代码,我认为一切都是正确的,我只是不知道如何返回它?

  • 本文向大家介绍返回一个数组,该数组填充有JavaScript中数字的所有数字的位置值,包括了返回一个数组,该数组填充有JavaScript中数字的所有数字的位置值的使用技巧和注意事项,需要的朋友参考一下 我们需要编写一个函数,该函数需要一个正整数,并返回一个数组,该数组填充有该数字的所有数字的位置值。 例如- 让我们为该函数编写代码。 这个问题非常适合递归方法,因为我们将迭代数字的每个数字。因此,

  • 问题 你想由数组创建一个字符串。 解决方案 使用 JavaScript 的数组方法 toString(): ["one", "two", "three"].toString() # => 'one,two,three' 讨论 toString() 是一个标准的 JavaScript 方法。不要忘记圆括号。

  • 这个程序对两者都使用get/set方法,但我就是不知道怎么做! 感谢有帮助的用户推荐字符串。valueOf,我现在有这个 public int getSeatNumber(){ <代码>字符串输出=“”seatLetter字符串。valueOf(座位号) <代码>返回输出;} 但仍有相同的错误,“类型不兼容,字符串无法转换为int”。 这是完整的对象,尽管并不是所有变量都已设置,因为这是可循环使用

  • 将数组的所有元素拼接成一个字符串并返回此字符串。 使用分隔符和结束分隔符。 使用 Array.reduce() 将元素拼接成一个字符串。 省略第二个参数 separator ,则默认使用分隔符','。 省略第三个参数 end ,默认使用与separator相同的值。 const join = (arr, separator = ',', end = separator) => arr.redu

  • 我想从中得到一个子字符串。 我想要的子字符串是一个数字字符序列。 输入 通常可以是任何字符串,但它们都有一个共同点: 有一个部分以KD-开头 并以数字结尾 数字之后的所有内容都将消失。 在上面的示例中,这个数字将分别为、、。但它可以是任何数字 现在我有一个子字符串,它包含KD之后的所有数字字符--但我希望只有字符串的0815ish部分。 我目前所拥有的 结果是,但我只想要(它可以是任何长度,但不可