旋转有序数组中找到目标值所在的角标
function fn (arr, target) {if (arr.length === 0) { // 如果数组长度为0 返回-1return -1;}if (arr[0] === target) { // 开头即target 返回0return 0;}if (arr[length - 1] === target) { // 结尾即targetreturn length - 1;}let length = arr.length;let middle; // 中间值let low = 0; // 头let height = length - 1; // 尾do {middle = Math.floor((low + height) / 2); // 去中间值if (arr[middle] === target) { // 如果中间值正好为targetreturn middle;}if (arr[middle] >= arr[0]) { // 如果中间大于开头,说明左边是升序if (target >= arr[0] && target < arr[middle]) { // target在左边升序之内 将范围缩小height = middle - 1; // 尾向中间移动} else {low = middle + 1; // 头向中间移动}} else { // 反之右边是升序if (target > arr[middle] && target <= arr[length - 1]) { // target在右边low = middle + 1;} else {height = middle - 1;}}} while (low <= height);return -1;
