2015-11-01 36 views
1

以下代码计算得到的值为str中每个数字的平方和。这笔金额再次计算为m次。数字拼图解决方案的这些数字平方和可以进一步优化吗?

Example: m = 2, str="123" 
At m=1 (1^2)+(2^2)+(3^2) = 1+4+9 = 14 
At m=2 (1^2)+(4^2) = 1+16 = 17 

所以17应该是这个输入的最终答案。对于大型输入或者当运行1000次以上的测试用例时,此代码会给出超出时间限制的错误。这个代码可以进一步优化?

Test case will be less than 1001 
1 <= str.length(), m <= 10^9 

     public static void puzzle(int m,String str) { 
      int ans = 0; 
      while (m > 0) { 
       ans=0; 
       m--; 
       int j = 0; 
       while (j < str.length()) { 
        int val = Integer.parseInt(str.charAt(j) + ""); 
        ans += val* val; 
        j++; 
       } 
       str = String.valueOf(ans); 
      } 
      System.out.println(ans); 
     } 

我已经试过我的水平最好,可以拿出上面的迭代解决方案。即使使用递归解决方案也无法改进。

递归代码:

public static int solve(int m, String n){ 
     if(m < 1) 
      return Integer.parseInt(n); 
     int idx = 0; 
     int res = 0; 
     while(idx< n.length()){ 
      int val = Integer.parseInt(n.charAt(idx) + ""); 
      res += val*val; 
      idx++; 
     } 
     return solve(m-1,String.valueOf(res)); 
    } 
+0

最初的最大数是多少?你确定结果将保存在32位'int'中吗?因为在这种情况下有很多技术优化的空间,如果没有,那么你的解决方案将是错误的。我的怀疑来自你的评论'M <= 10^9' ......这是什么意思? –

+0

更新了代码。 m <= 10^9表示m可以保持10^9的值。 你能列出你的技术优化吗? – Hulk

回答

0

不要使用字符串做手术。保持整数。

由于您只是添加数字的平方,所以您可以从最后一位数字开始,因此一个循环做模数和除数为10,直到零,将做的伎俩。

public static int puzzle(int m, String str) { 
    int value = Integer.parseInt(str); 
    for (int i = 0; i < m; i++) { 
     int sum = 0; 
     for (; value != 0; value /= 10) { 
      int digit = value % 10; 
      sum += digit * digit; 
     } 
     value = sum; 
    } 
    return value; 
} 
+0

你能告诉我为什么你建议不要使用字符串操作? – Hulk

+1

不必要的开销。你如何认为一个数字被转换为一个字符串?你想要优化,就是这样。你的代码转换为String(新对象),然后遍历字符,做'char +'“'这意味着'新的StringBuilder()。append(char).append(”“)。toString()'(2 new对象每次迭代),然后'parseInt()'。高开销。如果你至少已经做了一个简单的'char''0',它可能是可以忍受的,但是呢? – Andreas

相关问题