微博客

可能因为自己代码写的少的缘故吧,我做算法题的时候,经常会往复杂层面上考虑,比如标题上的这个问题“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

posted on 2013-05-01 11:47  飞鸟42  阅读(1401)  评论(0编辑  收藏  举报