挑战: 给定一个排序的名称数组(只有名字)和一个名称X,我需要找出它在数组中出现的次数。约束:只允许二进制搜索。我也不能使用任何字符串库函数。 样本输入:
docker run -it <repo-name> --net=host
输出: 1(因为pqr在字符串/单词数组中只出现一次)。
答案 0 :(得分:1)
1)比较字符串而不使用字符串库:自己实现字符串比较功能:比较两个字符串的前两个字符,只要它们相等,比较下一个字符,依此类推。
2)排序数组和二进制搜索:LocalGsmNlpBackend非常适合排序数组。设x为查询字符串。
步骤1:使用二进制搜索在已排序的数组中查找x
。
步骤2:如果找不到,则返回0。
步骤3:如果找到,则在左右子阵列中二进制搜索x
。记录结果索引。
重复步骤3(注意:每个循环中较小的左,右子阵列),如果在左(或右)子阵列中找不到x
,则向左(或右)方向停止搜索。先前找到的左右索引给出了结果范围。
答案 1 :(得分:1)
关于如何比较C中的字符串,有plenty questions,所以我将引导您解答这些问题及其答案。基本上,解决方案是逐个字符地比较字符串,直到找到一对不同的字符,或者直到你到达两个字符串的末尾。然后比较您到达的点上的字符,并返回该比较的结果。
至于使用二进制搜索来查找给定目标字符串在排序数组中出现的次数,可能最简单有效的解决方案是进行两次二进制搜索:一次用于起点,一次用于范围的终点数组元素的数量等于目标。然后,从起点到终点的距离将给出范围的长度。
以下二进制搜索例程将返回数组haystack
中最后一个元素的索引,该索引小于目标needle
(如果没有这样的元素,则返回-1):
int find_last_less_than(int needle, int *haystack, int length) {
int base = -1, step = length - base;
// loop invariants:
// 1. base == -1 || haystack[base] < needle
// 2. base + step >= length || haystack[base + step] >= needle
while (step > 1) {
step = (step + 1) / 2; // divide interval in half, rounding up
int index = base + step;
if (index < length && haystack[index] < needle) base += step;
}
return base;
}
请注意,为了简单起见(并且为了避免给整个解决方案提供勺子),此代码搜索整数数组而不是字符串,但我相信您可以根据需要找出如何修改它。
希望,还应该清楚如何修改搜索,以便找到最后一个小于目标的元素,而不是找到最后一个元素的索引。或等于目标。从后者中减去前者将产生目标在数组中出现的次数。
答案 2 :(得分:0)
以下是我为执行任务而编写的代码:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<select id="mSelect" >
<option value="val1" > DEF </option>
<option value="val4" > GRT </option>
<option value="val2" > ABC </option>
<option value="val3" > OPL </option>
<option value="val5" > AWS </option>
<option value="val9" > BTY </option>
</select>
这是执行任务的最有效方式吗?