- 浏览: 1471294 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
luhouxiang:
写的很不错,学习了
Extjs 模块化动态加载js实践 -
kingkongtown:
如果想改成淘宝后台那样,可以在编辑器批量上传图片呢?
kissy editor 阶段体会 -
317966578:
兄弟我最近也在整jquery和caja 开放一些接口。在git ...
caja 原理 : 前端 -
liuweihug:
Javascript引擎单线程机制及setTimeout执行原 ...
setTimeout ,xhr,event 线程问题 -
辽主临轩:
怎么能让浏览器不进入 文档模式的quirks模式,进入标准的
浏览器模式与文本模式
1.某产品页面左侧的边栏是一个允许用户自定义宽度(240-420像素)的div容器,现在设计师考虑在容器内放置一个8 X 8格的国际象棋棋盘,棋盘的总宽度是一个偶数,而同时,为了良好的视觉效果,必须保证容器两边所留的空白宽度相同。于是,Web前端开发工程师A现在面临 一个难题了,那就是如果用户设置的容器宽度为奇数,必须在页面渲染的时候,将它的实际宽度减少一个像素变为一个偶数。仔细考虑之后,A决定用他所精通的 JavaScript来实现一个函数f,这个函数的参数是一个正整数,返回值是一个最接近且不大于这个正整数的偶数,例如f(240)返回 240,f(311)返回310。A很快写出了这个函数:
function f(n){ if(n % 2) return n-1; return n; }
当A的同事C仔细研究了这个函数之后,指出其实还有更高效率的写法。
(1.a) 问题:如果您是C,您将如何改良这个函数呢?
2.在休息室里,A给大家讲了一道经典的微软面试题,题目是这样的:对于给定的一个字节表示的无符号整数,求将它表示成二进制之后,“1”出现的次数。例如5=101(2)->2,11=1011(2)->3……C说这道题很容易,只需要用一个简单的function就能实现:
function (n){ if(typeof n != “number” || n <= 0) return 0; var count = 0; while(n){ count += n & 0x1; n >>= 1 } return count; }
当C写出他的答案之后,A说,是的,这是解法之一,不过这样的效率仍然不够高,实际上我有更高效率的解法:
function (n){ if(typeof n != “number” || n <= 0) return 0; var count = 0; while(n){ n &= (n-1); count++; } return count; }
(2.a) 问题:为什么A说自己的解法效率比C的解法要高?
C看了A的解法,说道,这个办法确实高明。A说,针对这道题其实还有其他解法,比如查表法,因为只有8位,所以是可以考虑的,当然位数多了的话,查表法就不适合了。这时候,C忽然想到了什么,对A说,我想到了一种JavaScript特有的解法,不用循环,多于8位也适用,效率还比较高。
(2.b) 问题:请问您想到类似这样的解法了吗?请给出您的解题思路。
3.让页面元素可拖动是一种常用脚本实现的交互方式。基本的拖动是用鼠标点住某个元素在一个特定的可见区域内移动。现在A遇到的一个问题是在可拖动区域内有一个椭圆形的禁区,如下所示:
------------------------------------------------------
可拖动区域
(椭圆禁区)
-------------------------------------------------------
已知禁区的外接矩形的左上角坐标为(left,top)、宽高为(width,height)。A打算写个函数,用来判断鼠标是否位于禁区内。
(3.a) 问题:这个函数该如何实现呢?
C提醒A说这个交互比想象中复杂,需要考虑很多细节问题。
(3.b) 问题:如果您是A,实际要实现这个交互,您认为需要考虑哪些细节问题?
4.糊涂的A不小心把一个设计好的页面弄乱了,现在这个页面上有若干绝对定位的div,这些div有确定的左上角(top、left)和宽高 (width、height),页面初始化后,这些div的位置有可能重叠(如果两个div有任意部分相交,就认为这两个div重叠)。
这种界面被人看到可就惨了,然而弄乱的div数量如此之多,A不得不用JavaScript实现一个function,这个function检查页面上所 有绝对定位的div,输出一个包含重叠的div组合的数组。(如果DIV1与DIV2相交、DIV3、DIV4、DIV5两两相交、DIV6与DIV7相 交,那么输出结果为[[DIV1,DIV2],[DIV3,DIV4,DIV5],[DIV6,DIV7]])
(4.a) 问题:如果您是A,您将怎样实现这个function?
5.设计师交给A去实现一个布局,这个布局由三列等高的区域组成,左栏的宽度为40%-102px,中栏的宽度为200px,右栏的宽度为60%-102px。左中栏、右中栏之间的间隔均为2px。
一开始A觉得实现这样的布局根本不用花费什么功夫,可是具体实现的时候,却发现远没有想象中那么简单。Web标准、浏览器兼容性……各种需要考虑的细节都让A觉得自己陷入了麻烦之中。
(5.a) 问题:如果您是A,您将怎样实现这个布局?
6.请回顾您以往经历过的前端开发项目,谈谈您认为最能体现您前端开发水平的精彩部分。
我的一点答案:(欢迎斧正
)
1.a : 在传统语言中
可以用位操作提高效率:
function f(n) { return n&1?n-1:n; }
但是对于javascript,没有整数类型只有浮点类型,位操作也提高不了效率的,但是我想不到其他方法了。
引擎会对二进制进行优化的,二进制操作引擎内部使用整数直接位运算!
2.a : 1. A 的算法每次循环只执行一次位操作,C的算法每次执行两次位操作。
2. A 算法 很快可以使 n 收敛到 0 ,循环次数为 n 二进制中1的个数,C的算法 循环次数为 n 的位数 。
总结:假设n 二进制 1的个数为 m ,总的位数为 x ,x > m ,则
A的算法执行 m 次位操作,C的算法执行 2x 次位操作。
2.b : Number 有 本地方法 toString(radix) ,
1.本地方法更快
2.字符串比数值运算(尤其javascript中的位运算
)快
可得以下方法:
function f(n) { if(typeof n != "number" || n <= 0) return 0; var n_str=n.toString(2); var count=0; for(var i=0;i<n_str.length;i++) if(n_str.charAt(i)=='1') count++; return count; }
Java中Number也有toString ,但是toString 也是用 java 实现的,这种情况下 java不适合这种方法,但是javascript作为解释性语言,本地方法效率不容置疑。
ps:在编程之美(Beautiful Code)第十章种群计数(Population Count) 中提出了1位记数的分治策略算法,可以在 log2 (N) (N为整数二进制的位数)内得到答案:
相当于合并排序,从底向上直到总体完成,只不过这里每一小步都是可以利用二进制+并行完成的!
示意图:
代码:
/* 计算 x 中 1的个数 */ function popOne(x){ x = (x & 0x55555555) + ((x >> 1) & 0x55555555); x = (x & 0x33333333) + ((x >> 2) & 0x33333333); x = (x & 0x0F0F0F0F) + ((x >> 4) & 0x0F0F0F0F); x = (x & 0x00FF00FF) + ((x >> 8) & 0x00FF00FF); x = (x & 0x0000FFFF) + ((x >> 16) & 0x0000FFFF); return x; }
扩展:Counting the 1-Bits in an Array
目前最优解法:
1.首先 三个数 a,b,c 的所有1个数 popOne(a) +popOne(b) +popOne(c)
a有9个1,b 有6个1,c有8个1,h有7个1,l有9个1,则 9+6+8==7*2+9
其中算 a + b+ c的二进制结果表示 ,l表示二进制相加每位结果的低位 ,h表示二进制相加每位结果的高位位
h ← ab + ac + bc = ab + (a + b)c = ab + (a ⊕ b)c
l ← (a ⊕ b) ⊕ c
ps:关于上述逻辑表达式的推导
需要一点数字逻辑的基础。
1.首先画出真值表 :
2.写出最小项表示的与或表达式
h=a bc + ab c + abc + abc
3.画出卡诺图
4.写出最简逻辑表达式
h=ab+ac+bc
同理推出 l ,注意
a ⊕ b = a
b+ab
l= a ⊕ b ⊕ c
5.多输出最简推导
多个输出的表达式要不同的最小项最少
h=ab+(a+b)c=ab+( a ⊕ b )c
l=( a ⊕ b ) ⊕ c
需要5个门电路,5步运算即可。
/* 计算 a + b+ c的二进制结果表示. @return l表示二进制相加每位结果的低位 h表示二进制相加每位结果的高位位 */ function CSA(a,b,c){ var u = a ^ b; var v = c; h = (a & b) | (u & v); l = u ^ v; return { h:h, l:l } }
2.则 对一个数字中的每两个数加上前一步的低位结果算一下,累进可得数组中所有结果的1个数
/* 计算整数数组中所有数字包含 1 个数 */ function popArray(A){ var n=A.length; var tot = 0,ones = 0; var twos=0; for (var i = 0; i <= n - 2; i = i + 2) { var step=CSA(ones, A[i], A[i+1]) ; //获得高位 twos=step.h; //获得低位 ones=step.l; //高位立即加,低位累进 tot = tot + popOne(twos); } //注意所有高位的要 *2 tot = 2*tot + popOne(ones); // If there's a last one, // add it in. if (n & 1) tot = tot + popOne(A[i]); return tot; }
3.a b: 拖放实现的几个要点:
1. 定义一个拖放对象 A
2.监控 A 的 onmousedown 事件 ,记录当前拖放对象,拖放开始
3.当拖放开始时 ,监控 document 的 onmousemove onmouseup 事件
4. 当 onmousemove 事件触发时 ,将当前事件的坐标位置改变当前拖放对象的位置
5. 当 onmouseup 事件触发时 ,取消监控document的 onmousemove onmouseup 事件
对于禁区案例,需要 则需要 在 onmousemove 事件触发式 ,随时判断当前拖放对象的边界是否接触到了禁区边界,接触的话就停止更新拖放对象的位置。
细节包括:ie,ff 鼠标位置计算的差异 ,鼠标在拖放对象的位置要固定
对于此案例,还要考虑,椭圆区域公式,而不应简单考虑矩形区域。
4.a : 题目不是很明白,如果 div1 和 div2 相交 ,div2 和 div3 相交,div1 和 div3 不相交,那应该输出什么?我这个程序输出 [ [div1 ,div2 ,div3] ] 了。
直接贴代码了,这个应该属于聚类问题,蛮麻烦的,代码不保证完全正确,只体现基本思路。(将一堆div聚成几类,每一类)
/** 修改自 Ext.lib.Region ,详见 Extjs ext-base.js 1192行 **/ //判断两个绝对定位的div是否相交 function isCross(div1,div2) { var region1={ top:div1,style.top, left:div1.style.left, bottom:div1.style.top+div1.style.height, right:div1.style.left+div1.style.width }; var region2={ top:div2,style.top, left:div2.style.left, bottom:div2.style.top+div2.style.height, right:div2.style.left+div2.style.width }; var t = Math.max(region2.top, region1.top); var r = Math.min(region2.right, region1.right); var b = Math.min(region2.bottom, region1.bottom); var l = Math.max(region2.left, region1.left); if (b >= t && r >= l) return true else return false; } //divs 为所有的绝对定位的div //基本思想是 对每个div 把它归类到它相交的一组div function getAllCrosses(divs) { //每个div所属的组 var already={}; //所有相交div集合的数组 var result=[]; for(var j=0;j<divs.length;j++) { //所有和div j 相交的 div ,div j 是否已经属于一个分组 var subresult=already[j] || [divs[j]]; for(var i=j+1;i<divs.length;i++) { //i 和 j相交了。 if(isCross(divs[j],divs[i])) { subresult.push(divs[i]); //把i归到这个分组去 already[i]=subresult; } } //如果找和 j 相交的 div //并且 如果 j 所属的分组没有被添加到最终集合过。 if(!already[j] && subresult.length!=1) { result.push(subresult); } } return result; }
5.a : 涉及到 css 的列布局部分,详见:css 列布局
兼容 gecko,ie6,7,webkit
效果:
答案:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title> baidu layout </title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <link rel="stylesheet" type="text/css" href="../../base/css/core.css" /> <style type="text/css"> /*<![CDATA[*/ /*all hack for ie,shit*/ #wrap { width:95%; margin:0 auto; } #container { width: 100%;/*if no ,footer 在ie6消失*/ overflow:hidden; /*所有浏览器列背景会突破*/ position:relative; /* ie6,7列背景会突破*/ } h1 { font-size:30px; } .eqCol { /*无限高列配置*/ margin-bottom:-10000px; padding-bottom: 10000px; } .col { /*负边距 + 相对定位 固定列位置*/ float: left; margin-left: -100%; position: relative; display:inline; } /*]]>*/ </style> </head> <body> <div id="wrap"> <h1 style="text-align:center;"> center:200px;<br /> left:40%-102px;<br /> right:60%-102px; </h1> <div id="container" class="clearfix"> <div class="eqCol col" style="width:40%; left: 100%;"> <div class="eqCol" style="background: black; margin-right: 102px; color: white;"> left<br /> left<br /> </div> </div> <div class="eqCol col" style="width:60%; left: 140%;"> <div class="eqCol" style="background: green;margin-left: 102px;"> right<br /> right<br /> right<br /> right<br /> right<br /> right<br /> right<br /> right<br /> right<br /> </div> </div> <div class="eqCol col" style="width:200px; background: red; left: 40%; margin-left: -100px;"> center<br /> center<br /> center<br /> center<br /> center<br /> center<br /> </div> </div> <div id="footer" style="border:1px solid purple;"> This is the footer. </div> </div> </body> </html>
评论
你答得真好
我觉得不是很好啊,很多都是模模糊糊,具体答案我也搞不是很清楚
发表评论
-
continuation, cps
2013-09-12 16:49 2859起 随着 nodejs 的兴起,异步编程成为一种潮流 ... -
一种基于匹配回朔的 css3 选择器引擎实现
2013-05-07 20:40 3431一种基于匹配回朔的 css3 选择器引擎实现 介绍 C ... -
cubic-bezier 模拟实现
2013-01-05 16:34 14133cubic-bezier 曲线是 css3 动画的一个重要基石 ... -
构建前端 DSL
2012-10-11 22:10 5417目前在传统的软件开 ... -
Get cursor position and coordinates from textarea
2012-04-10 20:50 5105最近需要从 textarea 中获 ... -
兼容 ie 的 transform
2012-02-23 14:00 6464css 2d transform 是 css3 引入的一个新的 ... -
promise api 与应用场景
2012-02-07 17:34 7427promise 是 commonjs 社区中提出的异步规范,其 ... -
closure compiler 代码优化实例
2012-01-08 03:23 2859closure compiler 可以进行不少有意思的优化 ... -
write html parser
2011-12-01 02:48 2942首先需要声明 html 不能用正则表达式来直接匹配进行内容抽取 ... -
获取剪贴板数据
2011-11-07 23:31 6475兼容性: 获取剪贴板数据这块各个浏览器间存在很大的 ... -
url 映射问题
2011-11-07 21:52 3239背景 url mapping 我最早知道是作为 j ... -
tip:如何原生播放声音
2011-10-19 12:45 2991如果不想考虑浏览器间 ... -
转载:瀑布流布局浅析
2011-09-29 19:02 2887简介 如果你经 ... -
cross domain request
2011-09-29 18:39 2860场景 跨域请求是随着 ... -
基于多继承的树设计
2011-09-18 03:42 2277分类 树是一种常见 ... -
caja 原理 : 前端
2011-09-01 16:48 7113作为前端开放的基础安全保证,caja 是目前比较合 ... -
tokenization of html
2011-08-29 22:38 2802html 符号解析问题 场景: 在页面上输出包 ... -
ie 下 cloneNode 导致的属性克隆
2011-08-24 16:10 2496这个还是很值得记下,一直存在的很大隐患终于解决,由于在 ie& ... -
循环引用下的深度克隆
2011-08-04 20:39 2340深度复制和浅度复制 是当初初学 c 遇到的第一批问题,似乎使 ... -
模块的静态与动态循环依赖
2011-07-25 03:43 3297场景: 循环依赖 我是不支持的,但现实中似乎又确实需 ...
相关推荐
### Web前端开发经典面试题详解 #### CSS选择器的理解 1. **问题**: 下面有关CSS选择器的说法错误的是? - **选项**: - A. `.intro`---选择class="intro"的所有元素。 - B. `#firstname`---选择id="firstname...
### Web前端开发工程师经典面试题解析 #### 一、CSS选择器的理解 **题目**: 下面有关CSS选择器的说法错误的是?(C) - **选项分析**: - A. `.intro` --- 选择class="intro"的所有元素。 **正确**。这是一种常见...
要求是8个html页面,但是我比较懒,而且不会为了一点绩点去花多几个小时,所以最后只做了4个html,而且,有个小BUG,在Hbuilderx,是能正确展示所有效果的,但是打包成压缩文件后,.txt不能正确读取,.mp3的音乐也听...
习题中的答案也强调了这一点,并指明了在实现这一功能时可能遇到的问题和解决方案。 通过不断的学习和练习,我们可以将HTML、CSS、JavaScript的知识与实际应用相结合,从而创造出既有吸引力又实用的网页。在掌握了...
HFC网络的带宽是在用户之间共享的,下行方向的所有数据包都来自单一源头,即网络的前端(headend),因此不存在下行方向的冲突问题。 6. 在美国许多城市,接入互联网的方式包括拨号上网、DSL、有线电视网络等。这一...
面试官通常会提出一些问题来考察求职者对Java语言的理解程度。例如,位运算符的使用是Java语言中的一大亮点,它允许开发者直接对整型数据的二进制位进行操作。通过位运算符可以实现高效的数值计算,这一点在需要优化...
如果书中提及到的一些概念能够真正的帮助你解决一些问题,我也会感到非常高兴和荣幸。诚然,也非常希望你提出一些宝贵意见以帮助我提升自己。内容介绍文档中的内容将会采用章节的形式介绍,当然了,我会默认你已经在...
《驾考一点通APP项目》是一款专为驾驶考试学习者设计的应用程序,它结合了Java后端技术和Android前端技术,提供了全面的驾驶理论学习及模拟考试功能。此项目包含数据库设计、系统架构以及完整的开发思路,是学习和...
- **特性阻抗**:传输线上每一点的电压与电流之比,保持恒定可避免信号反射。 - **Smith圆图**:用于解决传输线上的阻抗匹配问题,直观展示阻抗在复平面上的映射。 4. **天线与辐射** - **天线参数**:增益、...
ChatGPT 使用模拟在老式计算机屏幕上打字外观的打字动画。 这个动画是通过两个重要的概念来实现的: 文本一次显示一个字符,从而产生打字的错觉。 闪烁的光标表示当前正在键入的字符的位置。
我们认为,Asta4D提供了对上述问题的完美答案,Asta4D通过分离的模板和代码向前端工程师提供了最为友好的工作环境,而另一方面,后端开发人员再也不必受到模板语言的折磨,Java将成为他们手中最趁手的武器,而且,...
(r - f + n) MOD n(正确答案):正确处理了循环队列中的元素个数计算问题。 ### 9. 电线上的小鸟问题 - **问题背景**:两种小鸟(A、B)交替或相同地停在电线上。 - **线段分类**:两端相同的小鸟形成一类线段,...
"工业机器人习题课+答案.docx" 本文档是关于工业机器人习题课的答案,涵盖了机器人的定义、分类、结构、动作机构、自由度、工作空间、机器人系统、操作机、驱动器、控制系统等方面的知识点。 工业机器人的定义:...
答案 转载至博客 慕容小匹夫 USEFUL URL 我的收藏 ###自己的Blog当然要顶O(∩_∩)O哈! 要经常去看的Blog ###Project 值得一去的开发者社区 标准 一些github org,离组织更近一点总是好的 常用的在线工具 休息的时候...
很抱歉,但根据您给出的信息,这似乎是一个关于高中一年级语文入学考试的文档,而并非与IT行业或专业IT知识相关的内容。...如果需要具体领域的知识,或者有更具体的问题,请告诉我,我会提供更详细的解答。
- **电压**:电场力将单位正电荷从一点移到另一点所做的功,单位为伏特(V)。 - **电阻**:阻碍电流流动的物理量,单位为欧姆(Ω)。 - **功率**:单位时间内完成的功,单位为瓦特(W)。 **知识点2:电路定律** ...
在开发的这一点上,只有某些关键字会提供答案。 如果您的查询没有任何匹配项,则搜索词列表将显示在屏幕上。 加载应用 可以通过启动服务器来加载此应用程序 在根文件夹中打开一个终端 输入“ npm install”,然后...
答案 unity_ios_capture_video USEFUL URL 我的收藏 ###自己的Blog当然要顶O(∩_∩)O哈! 要经常去看的Blog ###Project 值得一去的开发者社区 标准 一些github org,离组织更近一点总是好的 常用的在线工具 休息的...
2. **FAQ(常见问题解答)**:提供一系列常见问题及其答案,帮助用户快速找到解决方案。 3. **工单提交系统**:允许用户提交问题描述和联系方式,以便客服人员后续跟进处理。 4. **知识库**:收集整理各种有用的信息...