1. 程式人生 > 實用技巧 >陣列中查詢匹配相同字首的範圍

陣列中查詢匹配相同字首的範圍

//排名函式
const compareLen=function (str1,str2,start=0) {
  let dis=0;
  let len=0;
  while (dis===0&&start+len<str1.length&&len<str2.length){
    //超過字元,返回小於
    if(str1.charCodeAt(start+len)>str2.charCodeAt(len)){
      dis=1;
    }else if(str1.charCodeAt(start+len)<str2.charCodeAt(len)){
      dis
=-1; }else{ len++; } } if(start+len===str1.length&&len===str2.length){ dis=0 }else if(start+len===str1.length){ dis=-1 }else if(len===str2.length){ dis=0 } return dis; }; function findLen(str,hasSortArr,callback,start) { let l=0,r=hasSortArr.length; let index
=-1; if(hasSortArr.length>0){ const ri=callback(str,hasSortArr[r-1],start); if(ri===1){ return [r,r] }else if(ri===0){ l=r-1; while (l>-1&&callback(str,hasSortArr[l-1],start)===0){ l--; } return [l,r] }else{ r=r-1; } const li
=callback(str,hasSortArr[0],start); if(li===-1){ return [0,0] }else if(li===0){ r=l+1; while (r<hasSortArr.length&&callback(str,hasSortArr[r],start)===0){ r++; } return [l,r] }else{ l=l+1; } while(index===-1&&r-l>0){ const m=(l+r)>>1; //比較下座標大小 const order=callback(str,hasSortArr[m],start) if(order===1){ l=Math.max(l+1,m) }else if(order===-1){ r=Math.min(r-1,m) }else{ index=m; } } if(index===-1){ return [l,r] } if(index-l>0){ l=index; while(l>-1&&callback(str,hasSortArr[l-1],start)===0){ l=l-1; } } if(r-index>1){ r=index+1; while(r<hasSortArr.length&&callback(str,hasSortArr[r],start)===0){ r=r+1; } } } return [l,r] } //相同的字首開頭 const arr=['a','b','b','c','d']; const [start,end]=findLen('bc',arr,compareLen,0) console.log([start,end])