// 静态方法 只会运行一次 static { for(int i = 1 ; i <= 1000 ; i++){ // 转换为字符串 char [] s = Integer.toString(i * i).toCharArray(); // 这里使用了前缀和处理 后续主函数内直接调用就行 不需要再判断了 算是一种优化 PRE_SUM[i] = PRE_SUM[i - 1] + (dfs(s,i,0,0) ? i * i : 0); } }
/*** * * @param s 当前处理的字符串 * @param i 当前遍历到的数 i * @param p dfs枚举分割的起点 * @param sum i*i 字符串数的和 * @return */ privatestatic boolean dfs(char [] s, int i, int p,int sum){ // 当前已经分割到了 s的最后的一位 直接返回 if(p == s.length){ return sum == i; }
int x = 0; // 分割字符串 进行遍历 for(int j = p ; j < s.length ; j++){ // 因为是从前往后开始拆分 那么每拆一位 算出当前值 将到sum进行组合求出结果 x = x * 10 + s[j] - '0'; // 如果符合条件 直接返回 if(dfs(s,i,j+1,sum + x)){ returntrue; } } returnfalse; }