【问题标题】:Find first occurrence of 0 in a string of 1's and 0's在 1 和 0 的字符串中查找第一次出现的 0
【发布时间】:2015-12-24 23:22:00
【问题描述】:

这是一道面试题:

在 0 和 1 的排序字符串中,找到第一次出现的 0。字符串将有一个,然后是零

例如。

111110  , Return value:5  
11100000 , Return value:3  
11111111, Return value:-1  
00000000, Return 0  

基本方法:

  • 线性搜索:O(n)
  • 二分查找第一次出现的 0 : O(logn)

有没有更好的解决方案,可能在 O(1) 中。

面试官给出了一个线索,可以将字符串转换为数字,然后可以进行一些日志操作,但我无法弄清楚。

【问题讨论】:

  • 如果整数不是恒定大小(根据定义不在这里,否则所有其他方法也是恒定时间),则取整数的日志不是 O(1)跨度>
  • 如果你有一个稍微不同的观点并且只计算broadword操作,那么就有一个O(1)算法,但是每次我发布类似的东西时人们只是拒绝接受有不同的计算方式操作。我也怀疑面试官的意思,算法既不是众所周知的,也不是你随便想出来的。
  • @harold 如果我认为输入是一个整数,是否有机会通过使用位操作或任何其他技巧来降低时间复杂度
  • 如果输入是整数,则只有 32 个可能的值(或 64 个),您可以使用哈希映射函数将它们映射到结果。那将需要 O(1) 时间。但这不适用于字符串,因为要计算字符串的哈希函数(取决于所有字符),您需要读取成本 O(n) 的 al 字符,
  • @mc20 如果您将输入切成 (log n)^k 大小的单词(对于某些常数 k,并且 k>1 非常慷慨),您可以在常数时间内进行操作,然后进行二进制搜索,你会得到 O(log(n/log(n)^k)) 的复杂度,不幸的是,无论如何它与 O(log n) 相同。所以那里没有运气。如果将输入作为一个 n 位整数,则存在 O(1) 步宽词算法,但其步长不是恒定时间。

标签: algorithm search


【解决方案1】:

如果对数运算是O(1),那么首先我们可以将数字取反,加一然后取对数底数为2得到结果。

例如

1111110000000 -> 取反 -> 0000001111111 -> 加一 -> 0000010000000 -> 取底数 2 -> 8

所以结果是 8。

我们还可以创建一个 2 的幂的 Map 来摆脱日志操作。

【讨论】:

    【解决方案2】:

    有 n+1 个不同的字符串和可能的结果,因此提供正确答案所需的信息量(即您的程序必须进行的最少测试次数)为 O(ln n)。

    这是这里讨论的“查找第一位集”问题https://en.wikipedia.org/wiki/Find_first_set

    【讨论】:

    • 请添加一个例子来解释这一点:)
    • 数字的二进制表示有一些流行的技巧,但是将字符串转换为数字本身就是 O(n)。
    • @MichelBillaud 这不是问题所在。你可以假设它已经是一个整数,这样的解释开关不算数。但这并不重要,如果你有整数,仍然没有常数时间解决方案。
    • 当然有。在大小为 2^N 的表中使用该数字作为索引(大多数地方将不使用)
    • 对于 N=3,有 4 个字符串:111(又名 7)、110(6)、100(4)和 000(0)。下表可以解决问题 {0, ?, ?, ?, 1, ?, 2, -1} 问号未使用。
    【解决方案3】:

    零和一的排序字符串可以表示为 2 个计数 - 零的数量和一的数量。

    显然,使用这种表示法很容易找到第一个零的位置——它只是个数。

    【讨论】:

    • 你怎么知道有多少个零和一?你必须通过列表,成本 O(n) 就在那里。
    • 面试官提到将字符串转换为数字,无论如何都需要O(n)...你不妨将它转换为正确的数字而不是人为的东西复杂的
    • 我应该补充一点:经过多次这样的采访,我认为这不太可能成为提问的起点。这更有可能是在多步骤过程中的某个地方出现的,在早期的某个时候,只计算零和一而不是构建一个字符串会更好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-04
    • 1970-01-01
    • 2010-12-25
    相关资源
    最近更新 更多