zoukankan      html  css  js  c++  java
  • 添加字符到排序数组中sortAdd、sortFindLen

    //比较两字符的相等长度和大小
    function compareLen(n1,n2,str1,str2) {
      //求出相等部分
      var len=0;
      while (n1+len<=str1.length&&n2+len<=str2.length&&str1.charCodeAt(n1+len)===str2.charCodeAt(n2+len)){
        len++;
      }
      var code1=str1.charCodeAt(n1+len);
      var code2=str2.charCodeAt(n2+len);
    
      if(Number.isNaN(code1)&&Number.isNaN(code2)){
        return [len,0]
      }else if(Number.isNaN(code1)){
        return [len,-1]
      }else if(Number.isNaN(code2)){
        return [len,1]
      }else{
        //求出大小
        var dis=0;
        if(code1<code2){
          dis=-1
        }else if(code1>code2){
          dis=1
        }
        if(str1.substr(n1,len)!==str2.substr(n2,len)){
          console.log(dis,len,str1.substr(n1,len),'===',str2.substr(n2,len),n1,n2,str1.length,str2.length)
        }
    
        return [len,dis];
      }
    }
    //查找字符在数组的最大相等长度和大小
    function findLen(str,hasSortArr,callback) {
      var l=0,r=hasSortArr.length;
      var lock=-1;
      var len1=0,len2=0;
      var len=0,dis=0;
    
      if(hasSortArr.length>0){
        [len1,dis]=callback(str,hasSortArr[0]);
        if(dis<1){
          return [0,len1,dis]
        }
        [len2,dis]=callback(str,hasSortArr[r-1]);
        if(dis>-1){
          return [r-1,len2,dis]
        }
        while(lock===-1){
          var m=(l+r+1)>>1;
          //比较下坐标大小
          [len,dis]=callback(str,hasSortArr[m])
          if(dis===1){
            if(m+1===r){
              if(len<len2){
                lock=r;
                len=len2;
                dis=-1
              }else{
                lock=m;
              }
            }else{
              len1=len;
              l=m
            }
          }else if(dis===-1){
            if(l+1===m){
              if(len<len1){
                lock=l;
                len=len1;
                dis=1
              }else{
                lock=m;
              }
            }else{
              len2=len;
              r=m
            }
          }else{
            lock=m;
          }
        }
        return [lock,len,dis]
      }
      return [lock,0,1]
    }
    
    //[n,len,dis]
    Array.prototype.sortFindLen=function(str){
      return findLen(str,this,function (str1,str2) {
        return compareLen(0,0,str1,str2)
      })
    }
    //添加字符到排序数组中
    Array.prototype.sortAdd=function(str){
      if(typeof str==='string'){
        const [n,len,dis]=this.sortFindLen(str)
        if(dis===1){
          this.splice(n+1,0,str)
        }else if(dis===-1){
          this.splice(n,0,str)
        }
      }
    }
    
    const arr=['11','21']
    arr.sortAdd('111')
    arr.sortAdd('0')
    arr.sortAdd('3')
    console.log(arr)
    

      

  • 相关阅读:
    Smarty学习笔记(二)
    Smarty学习笔记(一)
    MVC学习笔记(一)
    2015羊年主流手机配置什么样?
    FPGA学习笔记(一)Verilog语法基础
    FPGA学习笔记(二)模块建立及变量连接
    STM32学习笔记(一)时钟和定时器
    Win8 HTML5与JS编程学习笔记(一)
    Win8 HTML5与JS编程学习笔记(二)
    LUOGU P2831 愤怒的小鸟 (NOIP 2016)
  • 原文地址:https://www.cnblogs.com/caoke/p/14668302.html
Copyright © 2011-2022 走看看