【发布时间】: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) 步宽词算法,但其步长不是恒定时间。