我正在尝试解决
Recurive Digit Sum
,实际上我解决了它,但是提交时我在3 runtime errors
上得到了large inputs
。
我已经优化了我的代码很多,但我仍然得到runtime errors
。我已经googled并尝试了我在互联网上获得的所有答案/解决方案,但它们都是错误的,这些代码无法通过所有测试用例。我认为我的代码应该进一步优化,但我不知道如何优化。function superDigit(n, k) {
// Write your code here
if (n < 10) return n
let c = ""
let i = 0
if (k && k > 0) {
while(i < k) {
c += n
i++
}
}
return findSum(c === "" ? n : c)
}
function findSum(n) {
let sum = 0
let i = 0
while(i < n.length) {
sum += +n[i]
i++
}
if (sum < 10) return sum
return findSum(sum.toString())
}
我被困住了,任何帮助将不胜感激!
我只是进一步优化了我的代码,所有测试用例都通过了。
注意:我没有使用像
reduce
这样的任何内置方法,否则这段代码应该更短,带有reduce
function superDigit(n, k) {
// Write your code here
if (n.length === 1) return n
const nArr = n.split('')
let sum = 0
let i = 0
while(i < nArr.length) {
sum += +nArr[i]
i++
}
sum = (sum * k) + ''
return superDigit(sum, 1)
}
我认为你的方法有效。您还可以在下面找到我的看法:
digsum()
:
function digsum(n){
return n<10? n :
digsum((""+n).split("").reduce((a,c)=>+a+(+c)))
}
function superDigit(n, k) {
// Write your code here
if (n < 10) return n
let c = ""
let i = 0
if (k && k > 0) {
while(i < k) {
c += n
i++
}
}
return findSum(c === "" ? n : c)
}
function findSum(n) {
let sum = 0
let i = 0
while(i < n.length) {
sum += +n[i]
i++
}
if (sum < 10) return sum
return findSum(sum.toString())
}
[123456,6600,888885439].forEach(n=>
console.log(superDigit(n,1),digsum(n)));
这是我不使用reduce的解决方案:
function arraySum(arr){
let result=0;
for(let i=0;i< arr.length;i++){
result =result+ Number(arr[i]);
}
return result;
}
function superDigit(n, k) {
// Write your code here
let sum =arraySum(n)*k;
// Handle edge cases
if (n.length === 0) return 0;
if (n.length === 1 && k === 1) return Number(n);
return recrusiveSDigit(sum);
}
function recrusiveSDigit(sum){
if(sum<10){
return sum;
}
return recrusiveSDigit(arraySum(String(sum)));
}