执行超时(12000 ms):如何优化此代码

Execution Timed Out (12000 ms): How can I optimize this code

提问人:HavaDev 提问时间:9/24/2023 最后编辑:Theodor ZouliasHavaDev 更新时间:9/24/2023 访问量:51

问:

我在代码战中的任务是返回 true 或 false,具体取决于输入数字是否为自恋数字(例如 153 = 1^3 + 5^3 + 3^3)。但是当我测试我的代码时,它说执行超时(12000 毫秒),我应该进一步优化代码。

有谁知道我该如何优化下面的代码?下面的代码是用 C# 编写的。

public class Kata
{
  public static bool Narcissistic(int value)
  {
    int digit = 0;
    int tempValue=value;
    int checkValue=value;
    int num;
    double sum = 0;

    //number of digits
    while(value!=0){
      value = value%10;
      digit++;
      value=value/10;
    }
    
    //sum
    while(tempValue!=0){
      num=tempValue%10;
      sum=sum+pow(num,digit);
      num=num/10;
    }
    if(sum==checkValue){
      return true;
    }else 
      return false;
  }
  
  //power
  private static int pow(int a,int b){
    int temp = a;
    for(int i=1;i<b;i++){
      a=a*temp;
    }
    return a;
  }
}
性能 优化 C# 10.0

评论

4赞 Jon Skeet 9/24/2023
提示:你是否通过代码进行了调试?我怀疑你的第二个循环条件不是你想要的。我还建议您将最后一个块替换为 ,遵循 .NET 命名约定(不是 - 甚至),并使用 Visual Studio 默认格式进行支撑,并避免代码由于缺少空格而看起来如此局促。whileifreturn sum == check;PowpowPower
0赞 Fildor 9/24/2023
tempValue永远不会是 0。

答:

1赞 groophy lifefor 9/24/2023 #1

在你的代码中是条件循环,但你从不改变这个值,所以它是一个无限循环,与性能无关tempValue

也许你可以替换

while(tempValue!=0) {
    num=tempValue%10;
    sum=sum+pow(num,digit);
    num=num/10;
}

tempValue = -1;
while (tempValue != 0)
{
        int num = tempValue % 10;
        sum += Math.Pow(num, digit);
        tempValue /= 10;
}

测试用例

Kata.Narcissistic(153);
// true

// DEBUG / NET6 [If you have care about performance]
// Time elapsed (ms): 6,998
// Time elapsed (ns): 7046900

评论

0赞 Luuk 9/24/2023
我做错了什么吗 它正在返回,请参阅:onlinegdb.com/aPAEJWH-QFalse
1赞 groophy lifefor 9/24/2023
我可能在某些地方做了一些小的更改,我提供了完整的代码,以便您可以将其与我的进行比较。请参见:onlinegdb.com/v00Wof6kF
0赞 Luuk 9/24/2023
好吧,我不打算比较它,因为我(现在)没有足够的时间来理解(这个问题)的问题......😉