我似乎无法使此代码正常工作。如果密钥在数组中,则代码应该提醒True,如果它不在数组中,它应该提醒false。我似乎无法做到这一点。谢谢!
<!DOCTYPE HTML>
<html lang="en-us">
<head>
<meta charset="utf-8">
<title>Search</title>
<script type="text/javascript">
function testFunction() {
var list = [ 1, 2, 3, 4, 5, 6, 7 ];
var key = 9;
var result1 = 0;
//var result2 = 0;
result1 = search(list, key);
}
function search(list, key) {
var left = 0;
var right = list.length - 1;
while (left <= right) {
var mid = left + ((right - left) >>> 1);
var cmp = key - list[mid];
if (cmp > 0 ){
left = alert("True");
} else if (cmp < 0){
alert("False");
}else {
return mid;
}
return mid;
}
}
</script>
</head>
<h1>Search:</h1>
<button type="button" onclick="testFunction()">Volume</button>
<div id="outputDiv"></div>
</html>
答案 0 :(得分:1)
例如,如果您遇到这两个条件,那么您很少会看到这样做的优势,而不是.indexOf
现在,你似乎没有移动你的中间点,只是返回它,而是尝试类似
function search(haystack, needle, i, j) {
var k;
if (i !== 0 && !i) i = 0;
if (j !== 0 && !j) j = haystack.length - 1;
if (needle < haystack[i] || haystack[j] < needle) return false;
if (i === j) return haystack[i] === needle;
while (i < j) {
k = Math.floor(i + (j - i) / 2);
if (haystack[k] === needle) return true;
if (haystack[k] < needle) i = k + 1;
else j = k - 1;
}
return (i === j) && (haystack[i] === needle);
}
所以你有
var arr = [1, 2, 3, 4, 5];
search(arr, 0); // false
search(arr, 1); // true
search(arr, 2); // true
search(arr, 3); // true
search(arr, 4); // true
search(arr, 5); // true
search(arr, 6); // false
编写一个名为search的JavaScript函数,它接受两个参数:一个名为list的数组和一个名为key的数字。该函数必须确定密钥是否存储在列表中。如果数字存储在数组中,则代码应返回true,否则返回false。
function search(list, key) {
return list.indexOf(key) !== -1;
}
在ECMAScript 6环境中,您可以使用Array.prototype.findIndex
function search(list, key) {
return list.findIndex(e => e === key) !== -1;
}
答案 1 :(得分:-1)
可能是你可以试试这个二元搜索功能
function binarySearch(array, key) {
var lo = 0,
hi = array.length - 1,
mid,
element;
while (lo <= hi) {
mid = ((lo + hi) >> 1);
element = array[mid];
if (element < key) {
lo = mid + 1;
} else if (element > key) {
hi = mid - 1;
} else {
return mid;
}
}
return -1;
}