Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 这个数字的平方和可以是一个谜';解决方案是否需要进一步优化?_Java_Math_Optimization_Time Complexity_Puzzle - Fatal编程技术网

Java 这个数字的平方和可以是一个谜';解决方案是否需要进一步优化?

Java 这个数字的平方和可以是一个谜';解决方案是否需要进一步优化?,java,math,optimization,time-complexity,puzzle,Java,Math,Optimization,Time Complexity,Puzzle,下面的代码计算一个值,该值是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.

下面的代码计算一个值,该值是
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);
        }
测试用例将小于1001

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;
}
publicstaticintpuzzle(intm,stringstr){
int value=Integer.parseInt(str);
for(int i=0;i
不要使用字符串执行操作。保持整数不变

因为你只需要加上数字的平方,你可以从最后一个数字开始,所以一个循环做模和除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;
}
publicstaticintpuzzle(intm,stringstr){
int value=Integer.parseInt(str);
for(int i=0;i
最初的最大数量是多少?您是否确定结果将保存在32位
int
?因为在这种情况下有很大的技术优化空间,如果没有,那么您的解决方案将是错误的。我的怀疑来自你的评论
M更新了代码。m最初的最大数量是多少?您是否确定结果将保存在32位
int
?因为在这种情况下有很大的技术优化空间,如果没有,那么您的解决方案将是错误的。我的怀疑来自你的评论
M更新了代码。你能告诉我你为什么建议不要使用字符串操作吗?不必要的开销。你认为一个数字是如何转换成字符串的?你想要优化,就是这样。您的代码正在转换为字符串(新对象),然后迭代字符,执行
char+”
,这意味着
newstringbuilder().append(char).append(“”).toString()
(每次迭代两个新对象),然后执行
parseInt()
。高开销。如果你至少做了一个简单的
char-'0'
,这可能是可以忍受的,但那???你能告诉我为什么建议不要使用字符串操作吗?不必要的开销。你认为一个数字是如何转换成字符串的?你想要优化,就是这样。您的代码正在转换为字符串(新对象),然后迭代字符,执行
char+”
,这意味着
newstringbuilder().append(char).append(“”).toString()
(每次迭代两个新对象),然后执行
parseInt()
。高开销。如果你至少做了一个简单的
char-'0'
,这可能是可以忍受的,但那???