最近我接受了一次采访,他们问我一个“搜索”问题。问题是:
假设存在一个(正)整数数组,其中每个元素与其相邻元素相比要么是1
,要么是-1
。
例:
array = [4,5,6,5,4,3,2,3,4,5,6,7,8];
现在搜索7
并返回其位置。
我给出了这样的答案:
将这些值存储在临时数组中,对它们进行排序,然后应用二进制搜索。
如果找到元素,则返回其在临时数组中的位置
(如果数字出现两次,则返回第一次出现的数字)
但是,他们似乎对这个答案不满意。
正确的答案是什么?
传统线性搜索的变体可能是一个很好的方法。让我们选择一个元素,比如数组[i]=2
。现在,数组[i 1]
将是1或3(奇数),数组[i 2]
将是(仅限正整数)2或4(偶数)。
这样继续下去,一个模式是可观察的——数组[i2*n]
将包含偶数,因此所有这些索引都可以忽略。
另外,我们可以看到
array[i + 3] = 1 or 3 or 5
array[i + 5] = 1 or 3 or 5 or 7
因此,接下来应该检查indexi 5
,并且根据在indexi 5
处找到的值,可以使用一个thon循环来确定要检查的下一个索引。
虽然这具有复杂性O(n)
(渐进复杂性方面的线性时间),但在实际情况下,它比正常的线性搜索要好,因为所有索引都没有访问。
显然,如果数组[i]
(我们的起点)是奇数,所有这些都将被逆转。
你的方法太复杂了。不需要检查每个数组元素。第一个值是4
,因此7
至少是7-4
元素,您可以跳过这些元素。
#include <stdio.h>
#include <stdlib.h>
int main (void)
{
int array[] = {4,5,6,5,4,3,2,3,4,5,6,7,8};
int len = sizeof array / sizeof array[0];
int i = 0;
int steps = 0;
while (i < len && array[i] != 7) {
i += abs(7 - array[i]);
steps++;
}
printf("Steps %d, index %d\n", steps, i);
return 0;
}
程序输出:
Steps 4, index 11
编辑:在@Martin Zabel的评论之后有所改进。
可以使用通常大于1的步长进行线性搜索。关键的观察结果是,如果例如数组[i]==4
而7尚未出现,那么7的下一个候选者位于索引i3
。使用一个while循环,它会反复直接指向下一个可行的候选人。
下面是一个实现,稍微概括一下。它查找数组中第一次出现的k
(受=1限制)或-1
如果没有出现:
#include <stdio.h>
#include <stdlib.h>
int first_occurence(int k, int array[], int n);
int main(void){
int a[] = {4,3,2,3,2,3,4,5,4,5,6,7,8,7,8};
printf("7 first occurs at index %d\n",first_occurence(7,a,15));
printf("but 9 first \"occurs\" at index %d\n",first_occurence(9,a,15));
return 0;
}
int first_occurence(int k, int array[], int n){
int i = 0;
while(i < n){
if(array[i] == k) return i;
i += abs(k-array[i]);
}
return -1;
}
输出:
7 first occurs at index 11
but 9 first "occurs" at index -1
9.5. 搜索元素 通过一步步访问每一个节点的方式遍历 XML 文档可能很乏味。如果你正在寻找些特别的东西,又恰恰它们深深埋入了你的 XML 文档,有个捷径让你可以快速找到它:getElementsByTagName 。 在这部分,将使用 binary.xml 语法文件,它看上去是这样的: 例 9.20. binary.xml <?xml version="1.0"?> <!DOCTYPE gra
本文向大家介绍Jquery搜索父元素操作方法,包括了Jquery搜索父元素操作方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Jquery搜索父元素操作方法。分享给大家供大家参考。具体分析如下: 1. parents()方法 格式: 用于获取当前匹配元素集合中每个元素的祖先元素,根据需要还可以使用一个选择器进行筛选。 如: 2. cloest方法 格式: 该方法从元素本身开始,逐级向上
假设我有这个HTML: 现在我要访问 ,它与标记在同一个tr中,带有href“Amazon”。最好的方法是什么?我需要一个for循环覆盖所有的div吗?还是我可以使用@findby注释?我是否需要多个@findby或@findall来获取列表中的所有div以便为Amazon检查这些div?
我想删除html和tables标签和里面的任何东西(childs),最好的方法是什么? 我试着像这样遍历文档,但它不起作用,在Jsoup文档中,它说从DOM及其子对象中删除元素:
问题内容: 在C ++和/或Java中实现语音搜索的最有效方法是什么?通过语音搜索,我的意思是替换听起来相似的元音或辅音。这对于名字特别有用,因为有时人们的名字会有一些奇怪的拼写。 我认为替换元音和一些辅音可能是有效的。最好包含一些特殊情况,例如末尾的静音E或F和PH。最好在C ++中使用cstrings或字符串吗?将替换的值存储在内存中或在每次寻找内容时调用函数会更好吗? 问题答案: Sound
问题内容: 我有一个数据库,其中有75,000+行,每天添加500多个条目。 每行都有标题和描述。 我创建了一个RSS feed,为您提供了特定搜索词的最新条目(例如,http://site.com/rss.rss?q = Pizza将为搜索词“ Pizza”输出RSS)。 我想知道什么是为此编写SQL查询的最佳方法。现在我有: 但是问题是执行查询需要2到10秒。 有没有更好的方法来编写查询,我是