【问题标题】:Can this sum of squares of digits of a number puzzle's solution be optimized further?可以进一步优化数字拼图解决方案的数字平方和吗?
【发布时间】:2016-02-01 18:17:32
【问题描述】:

下面的代码计算一个值,该值是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));
    }

【问题讨论】:

  • 最初的最大数量是多少?您确定结果将保留在 32 位 int 中吗?因为在这种情况下技术优化的空间很大,如果没有,那么你的解决方案就是错误的。我的怀疑来自您的评论M &lt;= 10^9...这是什么意思??
  • 更新了代码。 m

标签: java math optimization time-complexity puzzle


【解决方案1】:

不要使用字符串进行操作。保持整数。

由于您只是添加数字的平方,因此您可以从最后一个数字开始,所以一个循环进行模数和除以 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;
}

【讨论】:

  • 你能告诉我你为什么不建议使用字符串操作吗?
  • 不必要的开销。您认为如何将数字转换为字符串?你想要优化,就是这样。您的代码正在转换为字符串(新对象),然后迭代字符,执行 char + "",这意味着 new StringBuilder().append(char).append("").toString()(每次迭代 2 个新对象),然后是 parseInt()。高开销。如果你至少做了一个简单的char - '0' 可能是可以忍受的,但那???
猜你喜欢
  • 2020-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-05
  • 2020-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多