Javascript 如何优化该算法?

Javascript 如何优化该算法?,javascript,algorithm,Javascript,Algorithm,我最近参加了一个位置的在线筛选测试,其中一个问题是在一个位置插入一个5,该位置将使给定整数的值最大化。这是我的解决方案,但我的正确性得分为50%,性能得分为50%。我真的不知道哪里出了问题,也不知道如何改进,所以我想了解一下这是一种错误的方法 函数插入位(num){ 设neg=num5){ i++; } 分裂拼接(i,0,“5”); 返回neg?split.reverse().join(“”):split.join(“”); } 控制台日志(插入数字(237))我唯一能想到的是,如果split

我最近参加了一个位置的在线筛选测试,其中一个问题是在一个位置插入一个5,该位置将使给定整数的值最大化。这是我的解决方案,但我的正确性得分为50%,性能得分为50%。我真的不知道哪里出了问题,也不知道如何改进,所以我想了解一下这是一种错误的方法

函数插入位(num){
设neg=num<0;
让split=neg?(num*-1).toString().split(“”).reverse():num.toString().split(“”);
设数字=5;
设i=0;
while(拆分[i]>5){
i++;
}
分裂拼接(i,0,“5”);
返回neg?split.reverse().join(“”):split.join(“”);
}

控制台日志(插入数字(237))我唯一能想到的是,如果split值小于5,则尽早中断循环,以节省一些CPU周期

function insertDigit2(num) {
  let neg = num < 0;
  let split = neg 
    ? (num * -1).toString().split('').reverse()
    : num.toString().split('');
  
  let digit = 5;
  let i = 0;

  split.every(s => {
    if (s <= 5)
      return false;

    i++;
    return true
  })

  split.splice( i, 0, "5" );
  return neg ? split.reverse().join('') : split.join('');
}

console.log( insertDigit2(237) );
函数insertDigit2(num){
设neg=num<0;
设split=neg
?(num*-1).toString().split(“”).reverse()
:num.toString().split(“”);
设数字=5;
设i=0;
拆分。每个(s=>{

如果(s,我唯一能想到的是,如果split值小于5,就提前中断循环,以节省一些CPU周期

function insertDigit2(num) {
  let neg = num < 0;
  let split = neg 
    ? (num * -1).toString().split('').reverse()
    : num.toString().split('');
  
  let digit = 5;
  let i = 0;

  split.every(s => {
    if (s <= 5)
      return false;

    i++;
    return true
  })

  split.splice( i, 0, "5" );
  return neg ? split.reverse().join('') : split.join('');
}

console.log( insertDigit2(237) );
函数insertDigit2(num){
设neg=num<0;
设split=neg
?(num*-1).toString().split(“”).reverse()
:num.toString().split(“”);
设数字=5;
设i=0;
拆分。每个(s=>{
如果(s
const ref=5;
函数getModulo(num){
设len=num.toString().length;
设mod=1
而(len!==1){
mod*=10;
len-=1
}
返回模式
}
函数recBigNumForNeg(num){
if(parseInt(num/mod)>=ref){
返回'5'+num;
}
}
函数recBigNumForPos(num,mod){
如果(num==0){
返回参考
}
if(parseInt(num/mod)
上面的代码解决了您的问题,它不包含任何与字符串相关的操作。但是它确实有两个问题

  • 数字中涉及的数字应仅为1到9,但不应包括0。由于问题中未提及这一点,我有权不包括0
  • recBigNumForNeg
    是相同的方法,但只是逻辑上的颠倒,所以我把它作为空白,供您练习
  • 这只是问题的另一种解决方法,仅此而已。

    const ref=5;
    函数getModulo(num){
    设len=num.toString().length;
    设mod=1
    而(len!==1){
    mod*=10;
    len-=1
    }
    返回模式
    }
    函数recBigNumForNeg(num){
    if(parseInt(num/mod)>=ref){
    返回'5'+num;
    }
    }
    函数recBigNumForPos(num,mod){
    如果(num==0){
    返回参考
    }
    if(parseInt(num/mod)
    上面的代码解决了您的问题,它不包含任何与字符串相关的操作。但是它确实有两个问题

  • 数字中涉及的数字应仅为1到9,但不应包括0。由于问题中未提及这一点,我有权不包括0
  • recBigNumForNeg
    是相同的方法,但只是逻辑上的颠倒,所以我把它作为空白,供您练习
  • 这只是问题的另一种解决方法,仅此而已。

    正确性:

    如果输入为-237,则函数将返回2357而不是-2357。 这可以通过将return语句更改为

      return neg ? "-" + split.reverse().join('') : split.join('');
    
    性能:

    我不会将输入转换为字符串,而是执行MOD和DIV操作,将输入拆分为左部分和右部分,然后在中间插入5。我会对5的所有可能位置执行此操作。最后,我会选择最大值

    示例237:

    1st iteration: left=237; right=0   -> num=2375
    2nd iteration: left=23;  right=7   -> num=2357
    2nd iteration: left=2;   right=37  -> num=2573
    2nd iteration: left=0;   right=237 -> num=5237
    
    守则:

    function insertDigit(num) {
      var digit = num > 0 ? 5 : -5;
      var max = num * 10 + digit;
      var digitPos = 1;
      var left = num;
      var right = 0;
      
      while (left != 0) {
        right = num % digitPos;
        left = (num - right) * 10;
    
        max = Math.max(max, left + digitPos * digit + right)
        digitPos = digitPos * 10;
        }
      
      return max;
    }
    
    正确性:

    如果输入为-237,则函数将返回2357而不是-2357。 这可以通过将return语句更改为

      return neg ? "-" + split.reverse().join('') : split.join('');
    
    性能:

    我不会将输入转换为字符串,而是执行MOD和DIV操作,将输入拆分为左部分和右部分,然后在中间插入5。我会对5的所有可能位置执行此操作。最后,我会选择最大值

    示例237:

    1st iteration: left=237; right=0   -> num=2375
    2nd iteration: left=23;  right=7   -> num=2357
    2nd iteration: left=2;   right=37  -> num=2573
    2nd iteration: left=0;   right=237 -> num=5237
    
    守则:

    function insertDigit(num) {
      var digit = num > 0 ? 5 : -5;
      var max = num * 10 + digit;
      var digitPos = 1;
      var left = num;
      var right = 0;
      
      while (left != 0) {
        right = num % digitPos;
        left = (num - right) * 10;
    
        max = Math.max(max, left + digitPos * digit + right)
        digitPos = digitPos * 10;
        }
      
      return max;
    }
    

    将数字转换为字符串以对其执行数学表达式通常不如使用除法和余数(
    /
    %
    )提取数字。负数正确吗?负数接近0时会最大化。@moreON是的,它也适用于负数。我相信正确率为50%的原因是因为它刚刚超时并因此被标记为错误。我试图思考如何计算一个数字以添加到给定值中n number在给定位置插入5,但我想不出更好的方法您最好添加一个预期输入及其输出的示例。将数字转换为字符串以对其执行数学表达式通常不如使用除法和余数(
    /
    %
    )提取数字。负数正确吗?负数接近0时会最大化。@moreON是的,它也适用于负数。我相信正确率为50%的原因是因为它刚刚超时并标记为wron