输入一个小于100的正整数n,输出一个最小正整数m,使得m的各位平方之和等于n。
/** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * @param n int整型 正整数 * @return int整型 */ function getNumber( n ) { // write code here let i = 1 while (true) { let numArr = `${i}`.split('').map(item => parseInt(item)) let count = 0 for (let num of numArr) { count += Math.pow(num, 2) } if (count === n) { return i } i++ } } module.exports = { getNumber : getNumber };
function getNumber( n ) { // write code here let dp=new Array(n+1).fill(0).map(()=>new Array(10).fill(Infinity)); for(let i=0;i<=n;i++) dp[i][0]=999999; for(let j=0;j<=9;j++) dp[0][j]=0; for(let i=1;i<=n;i++){ for(let j=1;j<=9;j++){ //如果j*j大于i,则不能将j加入进来 if(j*j>i) dp[i][j]=dp[i][j-1]; else{ let tmp=dp[i-j*j][j]+''; let arr=tmp.split(''); arr.push(j+''); let num=Number(arr.sort().join('')); dp[i][j]=dp[i][j-1]<num?dp[i][j-1]:num; } } } return dp[n][9] }借鉴力扣硬币凑零钱那道题,将问题转化为硬币为[1,2,3,4,5,6,7,8,9],从中选择若干个,凑出n,a1^2+a2^2+a3^2+...=n