【发布时间】:2019-04-29 16:39:07
【问题描述】:
我遇到了一个面试问题,要求应聘者用相同的数字计算数组中的所有数字。 例如:
用 int input = 394 计算所有数字相同的数字 int[] arr = {1, 14, 101, 349, 439, 745, 934}
该函数将返回 3,因为 439、934、349 共享相同的数字。 问题是如何在 O(log n) 时间内解决这个问题?我还是大 O 概念的新手,除了 O(n) 和 O(n^2)...我无法理解如何归档 O(log n)。
我的第一个想法是: 我会计算数组中所有元素的数字总和。如果总和相等,则它们包含与输入数字相同的数字。
int counter = 0;
while (num > 0) {
int digitSum += num % 10;
num = num / 10;
}
for(int i = 0; i < arr.length; i++) {
int k = arr[i];
while (k > 0) {
int sumOfDigits += k % 10;
k = k/10;
}
if(sumOfDigits == digitSum) {
counter++;
}
}
我知道这至少需要 O(n) 时间,但我很难找到更好的解决方案。
【问题讨论】:
-
你怎么能数出事物的数量而不数所有的事物呢?如果您可以预处理,您将能够知道一些您可以跳过的东西;但您仍然需要对所有内容进行预处理。
-
我想你可以置换输入的数字(394、349、934、943、439、493),然后在数组中搜索所有这些数字。
-
为了扩展安迪的评论,对于每个数字排列,您使用二进制搜索来查找数组中数字的索引。如果找到了,则在索引的左侧和右侧计算相同的数字。
-
如果总和相等,则它们包含与输入数字相同的数字。 - 295 怎么样?
-
我看不出你怎么能在 log n 时间内做到这一点。如果整个列表有效怎么办。您需要查看每个值。你能做的最好的就是线性
标签: java arrays algorithm time-complexity big-o