【发布时间】:2017-02-03 05:19:03
【问题描述】:
我正在尝试编写一个函数,它接受一个正整数并返回下一个包含相同数字的较小正整数,当没有包含相同数字的较小数字时返回-1。
For example:
nextSmaller(21) == 12
nextSmaller(531) == 513
nextSmaller(2071) == 2017
我写了一个代码来解决这个问题,但我真的不知道如何进一步优化它。请你帮助我好吗?它在 repl.it 上运行得相当快,但是当我提交它时,它说它需要超过 1200 毫秒,并且即使所有测试都通过了也不允许我提交它。
function nextSmaller(n) {
var nArray= n.toString().split("")
var minimumNum = 1 + Array(nArray.length).join('0')
for(var i=n-1; i >= minimumNum; i--) {
var newNumArray = i.toString().split('');
var counter = 0;
for (var j=0; j<newNumArray.length; j++) {
if (nArray.indexOf(newNumArray[j]) > -1) {
counter++
nArray.splice(nArray.indexOf(newNumArray[j]), 1)
if (counter === n.toString().split("").length) {
return i;
}
}
}
nArray = n.toString().split("");
if (i === Number(minimumNum)) return -1;
}
}
【问题讨论】:
-
或许这更适合code review
-
寻找模式来缩小问题空间。例如,您应该只检查输入中数字的排列。
-
看起来这是 Codewars 上的一个 kata
-
是的,它是代码战 JohanP 上的一个 kata。谢谢 E.Sundin,我会把它贴在那里。 4castle,我不明白你的意思,你能详细说明一下吗?
-
如果你使用 c++,问题似乎在于找到下一个字典顺序更小的排列,你可以使用 next_permutation 和合适的比较函数cplusplus.com/reference/algorithm/next_permutation 或者你可以自己实现它。但是您可能需要处理在下一个较小排列中有前导零的特殊情况
标签: javascript string algorithm math numbers