首页 > 技术文章 > 深圳傲冠在线笔试小结

MockingBirdHome 2013-10-30 17:00 原文

刚刚做完深圳奥冠软件的在线笔试题, 由于是在实习公司上班做其他公司的笔试题,心里总有点放不开,生怕被抓住,好吧,结果做得确实不好~ : ( 

其实题目都很简单,基本上都做过,只是隔得太久远都生疏了, 看来我很有必要花点时间把这些都来个“温故而知新”。好吧,就废话这么多吧, 来看看题目:

1.请实现一个效果, 如下图所示:

点击“start”按钮时,红色的小方块,做匀减速运动,知道速度为0的时候停下来。  这里需要考虑初始速度和加速度的可能取值,我理解的题意是初始速度v0>0,还有一个为负的加速度a。当然,如果要想物理学里面那样把速度、加速度考虑成一个矢量的话那就更复杂一点了。

下面是我对这个题的code:

<!DOCTYPE html>
<html>
<head>
    <title>DIV</title>
    <meta charset="utf-8">
    <style type="text/css">
    #box1{
        position: absolute;
        left: 0;
        top: 0;
        width: 100px;
        height: 100px;
        background-color: red;
    }
    #btn1{
        position: absolute;
        top:120px;
        left:0;
    }
    </style>
    <script>
    /*
        @iSpeed:当前速度
        @a: 加速度
    */
    var oBtn1 = document.getElementById("btn1");
    var iSpeed = 35.33;
    var a = -2.222;
    function startMove(){
        var oBox1 = document.getElementById("box1");
        var time = setInterval(function(){
            iSpeed = iSpeed>0? Math.ceil(iSpeed): Math.floor(iSpeed);
            iSpeed+=a;
            if(iSpeed <= 0){
                clearInterval(time);
            }
            else{
                oBox1.style.left = oBox1.offsetLeft + iSpeed + 'px';
            }
        }, 30);
    }
    
    </script>
</head>
<body>
    <div id="box1">
    </div>
    <input id="btn1" type="button" value="start" onclick = "startMove()">
    
</body>
</html>

 上面的iSpeed表示速度,a很显然就是加速度了。。 点击"start"按钮后每隔30微妙我调用一次function,直到速度小于等于零的时候才关闭定时器。在这个函数当中,微妙首先对这个速度进行一个取整,因为后面我的要在偏移量oBox1.offsetLeft的基础上加上这个速度的大小,这个大小当然要是一个整数,难道你见过半个像素的偏移么?:-)

2.一个文本输入框输入一条字符串,验证这个字符串是否是一个合法的邮箱地址,如果是,把旁边的一个div编程可拖动的!

这个题目我自己理解错了,以为可以用HTML5的拖放属性,不用去管兼容性,但是我错了。 当我做完事,监考老师告诉我:“同学,你想得太简单了” : (  -【尴尬】,下面这是我做了兼容性之后的代码:

<!DOCTYPE html>
<html>
<head>
    <title>DIV</title>
    <meta charset="utf-8">
    <style type="text/css">
    #box1{
        position: absolute;
        top: 50px;
        left: 100px;
        width: 100px;
        height: 100px;
        background-color: red;
    }
    </style>
    <script>
    function allowDrag(oDiv){
        oDiv.onmousedown = function(ev){
            var oEvent = ev||event;
            var disX = oEvent.clientX - oDiv.offsetLeft;
            var disY = oEvent.clientY - oDiv.offsetTop;

            document.onmousemove = function(ev){
                var oEvent = ev||event;

                oDiv.style.left = oEvent.clientX - disX + 'px';
                oDiv.style.top = oEvent.clientY - disY + 'px';
            };

            document.onmouseup = function(ev){
                document.onmousemove = null;
                document.onmouseup = null;
            }
        }
    
    }
    function check(str){
        var oRule = /^[a-zA-Z0-9]+@(([a-zA-Z0-9]+)[.])+[a-z]{2,4}$/i;
        return oRule.test(str);
    }
    window.onload = function(){
        var oEmail = document.getElementById("email");
        var oBox1 = document.getElementById("box1");
        
        oEmail.onblur = function(){
            var string = oEmail.value;
            if(check(string)){
                allowDrag(oBox1);
            }
        }
    }
    </script>
</head>
<body>
    <input id="email" type="text">
    <div id="box1"></div>
    
</body>
</html>

 逻辑非常简单,首先用正则来验证邮箱(这里验证邮箱我没有考虑下划线,后来想想这个东西还是加上去比较靠谱,要是你的BOSS讨厌那些不支持下划线邮箱你就惨了),如果验证通过,那么调用allowDrag函数,通过mousedown里面嵌入mousemove,mouseup来实现拖放效果。 这里的clientX,clientY还有offsetLeft, offsetTop你可要搞懂是嘛意思,别说你不知道。

3.用HTML5 canvas实现一个小画板

OMG~  玩过一点HTML5的同学我相信你们都实现过这个吧!

<!DOCTYPE html>
<html>
<head>
    <title>DIV</title>
    <meta charset="utf-8">
    <style type="text/css">
    body{ background : gray;}
    #c1{background: white;}
    </style>
    <script>
    window.onload = function(){
        var oC = document.getElementById("c1");
        
        var oGC = oC.getContext('2d');

        oC.onmousedown = function(ev){
            var ev = ev || window.event;
            oGC.moveTo(ev.clientX - oC.offsetLeft, ev.clientY - oC.offsetTop);

            document.onmousemove = function(ev){
                var ev = ev || window.event;
                oGC.lineTo(ev.clientX - oC.offsetLeft, ev.clientY - oC.offsetTop);
                oGC.stroke();
            }
            document.onmouseup = function(){
                document.onmousemove = null;
                document.onmouseup = null;
            }

        };
        
    }
    </script>
</head>
<body>
    <canvas id="c1" width="400" height = "400">
    </canvas>
</body>
</html>

在第二题的基础上,只要你懂moveTo, lineTo和stroke这几个方法你就可以把它拿下了, 是不是很简单呢?

 

好吧,最后来一个总结。  傲冠是个好公司,服务态度很不错,做完笔试还悉心的指出你存在的问题,给我的感觉是这个公司的人都很棒,公司应该很有活力!   算了,  不说多了,  估计我是没戏了...  没有好好准备下今天的笔试挺后悔的,斌哥,谢谢你!

推荐阅读