题目描述:给出一个升序数组 arr 和一个指定值 val,找到数组中第一个大于或等于 val 的值的索引(索引从1开始),若是不存在则返回 -1
如:arr = [3, 5, 7] val = 4,则输入为 2
二分搜索
function getIndex(val, arr) {
const length = arr.length;
if(arr[length -1] < val) return -1
let left = 0;
let right = length - 1;
let middle;
while(right > left){
middle = left + Math.floor((right - left) / 2);
if (arr[middle] < val) {
left = middle + 1;
} else {
right = middle
}
}
return right + 1
}
测试用例
function createAscendingArr (length = 10) {
let val = 0;
return new Array(length).fill(0).map(() => {
val += Math.floor(Math.random() * Math.random() * 20)
return val
})
}
function createRandomNumber(){
return Math.floor(Math.random() * Math.random() * 100)
}
function checkGetIndex(length, val, arr) {
for(let i = 0; i < length; i++) {
if (arr[i] >= val) {
return i + 1
}
}
return length + 1
}
function test(){
for(let i = 0; i < 10; i++) {
const arr = createAscendingArr(Math.floor(Math.random() * 20 + 10))
const val = createRandomNumber()
const index1 = getIndex(arr.length, val, arr)
const index2 = checkGetIndex(arr.length, val, arr)
if (index1 !== index2) {
console.log(arr, val)
} else {
console.log(true)
}
}
}
test()