可能因为自己代码写的少的缘故吧,我做算法题的时候,经常会往复杂层面上考虑,比如标题上的这个问题“Javascript打印出1-10000之间的所有对称数【2012 百度】”,最开始我就绕了好几个弯。
方案一:(firefox:28ms chrome:3ms)
由内到外比对法。这是最初自己想到的方案,很二的感觉。。。从数字的位数中间向两边比对,碰到不相同的数字返回false,否则返回true,这个要考虑奇位对称数和偶位对称数的不同情况,当数字为奇位对称数的时候,首先要删除掉中间可能成为对称轴数的数字,然后再比对。
var isSymmetry = function (num){ var i,l,m,n; aSingleNumber = num.toString().split(""); l = aSingleNumber.length; if (l >= 2){ if (l%2 === 1){//如果数字为奇数个数,删除掉中间的那个可能成为对称轴的数字 aSingleNumber.splice(Math.floor(l/2),1); } for (m = aSingleNumber.length/2 -1,n = m + 1;m >= 0,n < aSingleNumber.length; m--,n++){//数字从中间向两边比对,碰到不相等则返回false if (aSingleNumber[m] !== aSingleNumber[n]){ return false; } } return true; } }
方案二(推荐):(firefox:25ms chrome:2ms)
由外到内比对法。注意把小于10(即程序中的 l<2)的数字排除掉。
var isSymmetry = function (num) { var sNum = num.toString(); for (var i = 0,l = sNum.length; i < l / 2 ; i++) { if (sNum.charAt(i) !== sNum.charAt(l - 1 - i) || l < 2) { return false; } } return true; }
方案三:(firefox:37ms chrome:10ms)
逆序相等比对法。我想这个答案才是面试人员真正想要的答案吧,因为只有这个才能体现对称数的本质:一个数的逆序数等于自身。但执行效率上慢了许多,猜想可能是逆序数转化用到的函数过多的原因吧,有看明白为什么慢的朋友还请不吝赐教!
var isSymmetry = function (num) { nInversionNumber = +(num.toString().split("").reverse().join("")); if (num === nInversionNumber && num >= 10){ return true; } return false; }
方案四:(firefox:24.7ms chrome:8ms)
逆序相等字符比对法。原理同方案三,代码的不同之处在于,判断相等的时候用的是字符串比较,性能上比方案三有所提高。
var isSymmetry = function (num) { var sInversionNumber ="", sNum = num + ""; for (i = sNum.length; i >= 0 ; i--){ sInversionNumber += sNum.charAt(i); } if (sNum === sInversionNumber && num >= 10){ return true; } return false; }
下面是调用测试:
var aSymmetryNumbers = function (a,b){ var result = []; for (var i = a; i < b; i++){ if (isSymmetry(i)){ result.push(i); } } return result; } //test var foo = document.getElementById("foo"); var bar = document.getElementById("bar"); foo.onclick = function () { bar.innerHTML = aSymmetryNumbers(0,10000); }
<body> <button id="foo">按钮</button> <div id="bar"></div> </body>
从性能上看:方案一 ≈ 方案二 > 方案四 > 方案三
从代码可读性、可维护性上看:方案二 ≈ 方案三 > 方案四 > 方案一
综合考量下,方案二无疑是最佳选择。
方案一、四为本人原创,方案二、三参考自http://hi.baidu.com/shenwa12/item/8f240ad865982a2439f6f7b2