`
yiminghe
  • 浏览: 1453249 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

一些前端问题以及我的一点答案

阅读更多

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;
					
				}
 

演示 @ google code


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

 

效果:

 

演示@google code

 

答案:

 

<!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>
 

 

 

 

 


 

  • 大小: 52.2 KB
  • 大小: 14.9 KB
  • 大小: 14.8 KB
  • 大小: 37.7 KB
1
0
分享到:
评论
3 楼 liuhuiashazj 2009-06-13  
收到面试通知了吗?
2 楼 yiminghe 2009-06-08  
liuhuiashazj 写道

你答得真好

我觉得不是很好啊,很多都是模模糊糊,具体答案我也搞不是很清楚
1 楼 liuhuiashazj 2009-06-08  
你答得真好

相关推荐

    Web前端开发经典面试题(附参考答案)

    ### Web前端开发经典面试题详解 #### CSS选择器的理解 1. **问题**: 下面有关CSS选择器的说法错误的是? - **选项**: - A. `.intro`---选择class="intro"的所有元素。 - B. `#firstname`---选择id="firstname...

    Web前端开发工程师经典面试题(附参考答案)

    ### Web前端开发工程师经典面试题解析 #### 一、CSS选择器的理解 **题目**: 下面有关CSS选择器的说法错误的是?(C) - **选项分析**: - A. `.intro` --- 选择class="intro"的所有元素。 **正确**。这是一种常见...

    大一下Web前端期末大作业

    要求是8个html页面,但是我比较懒,而且不会为了一点绩点去花多几个小时,所以最后只做了4个html,而且,有个小BUG,在Hbuilderx,是能正确展示所有效果的,但是打包成压缩文件后,.txt不能正确读取,.mp3的音乐也听...

    计算机网络 自顶向下方法第六版 课后答案

    HFC网络的带宽是在用户之间共享的,下行方向的所有数据包都来自单一源头,即网络的前端(headend),因此不存在下行方向的冲突问题。 6. 在美国许多城市,接入互联网的方式包括拨号上网、DSL、有线电视网络等。这一...

    webDevDetails:前端工作、es6、canvas、构建工具等开发笔记!

    如果书中提及到的一些概念能够真正的帮助你解决一些问题,我也会感到非常高兴和荣幸。诚然,也非常希望你提出一些宝贵意见以帮助我提升自己。内容介绍文档中的内容将会采用章节的形式介绍,当然了,我会默认你已经在...

    驾考一点通APP项目.rar

    《驾考一点通APP项目》是一款专为驾驶考试学习者设计的应用程序,它结合了Java后端技术和Android前端技术,提供了全面的驾驶理论学习及模拟考试功能。此项目包含数据库设计、系统架构以及完整的开发思路,是学习和...

    高频电路原理课后习题答案

    - **特性阻抗**:传输线上每一点的电压与电流之比,保持恒定可避免信号反射。 - **Smith圆图**:用于解决传输线上的阻抗匹配问题,直观展示阻抗在复平面上的映射。 4. **天线与辐射** - **天线参数**:增益、...

    如何在 React 中构建 ChatGPT 打字动画

    ChatGPT 使用模拟在老式计算机屏幕上打字外观的打字动画。 这个动画是通过两个重要的概念来实现的: 文本一次显示一个字符,从而产生打字的错觉。 闪烁的光标表示当前正在键入的字符的位置。

    JavaWeb框架asta4d.zip

     我们认为,Asta4D提供了对上述问题的完美答案,Asta4D通过分离的模板和代码向前端工程师提供了最为友好的工作环境,而另一方面,后端开发人员再也不必受到模板语言的折磨,Java将成为他们手中最趁手的武器,而且,...

    csp模拟卷4-8.22模拟题附答案

    (r - f + n) MOD n(正确答案):正确处理了循环队列中的元素个数计算问题。 ### 9. 电线上的小鸟问题 - **问题背景**:两种小鸟(A、B)交替或相同地停在电线上。 - **线段分类**:两端相同的小鸟形成一类线段,...

    工业机器人习题课+答案.docx

    "工业机器人习题课+答案.docx" 本文档是关于工业机器人习题课的答案,涵盖了机器人的定义、分类、结构、动作机构、自由度、工作空间、机器人系统、操作机、驱动器、控制系统等方面的知识点。 工业机器人的定义:...

    leetcode答案-Note_forUnity:这是我学习Unity3D的笔记

    答案 转载至博客 慕容小匹夫 USEFUL URL 我的收藏 ###自己的Blog当然要顶O(∩_∩)O哈! 要经常去看的Blog ###Project 值得一去的开发者社区 标准 一些github org,离组织更近一点总是好的 常用的在线工具 休息的时候...

    高一语文9月入学考试试题(扫描版,无答案)新人教版 试题.doc

    很抱歉,但根据您给出的信息,这似乎是一个关于高中一年级语文入学考试的文档,而并非与IT行业或专业IT知识相关的内容。...如果需要具体领域的知识,或者有更具体的问题,请告诉我,我会提供更详细的解答。

    电工电子学课后习题答案

    - **电压**:电场力将单位正电荷从一点移到另一点所做的功,单位为伏特(V)。 - **电阻**:阻碍电流流动的物理量,单位为欧姆(Ω)。 - **功率**:单位时间内完成的功,单位为瓦特(W)。 **知识点2:电路定律** ...

    BookReadingApp:基于Udacity前端Web开发学位的React读书应用

    在开发的这一点上,只有某些关键字会提供答案。 如果您的查询没有任何匹配项,则搜索词列表将显示在屏幕上。 加载应用 可以通过启动服务器来加载此应用程序 在根文件夹中打开一个终端 输入“ npm install”,然后...

    leetcode答案-unity_ios_capture_video:unity_ios_capture_video

    答案 unity_ios_capture_video USEFUL URL 我的收藏 ###自己的Blog当然要顶O(∩_∩)O哈! 要经常去看的Blog ###Project 值得一去的开发者社区 标准 一些github org,离组织更近一点总是好的 常用的在线工具 休息的...

    客服中心模块代码

    2. **FAQ(常见问题解答)**:提供一系列常见问题及其答案,帮助用户快速找到解决方案。 3. **工单提交系统**:允许用户提交问题描述和联系方式,以便客服人员后续跟进处理。 4. **知识库**:收集整理各种有用的信息...

    谷歌师兄的leetcode刷题笔记-MCQ_Generator:通过将文本或文章作为输入来帮助教师生成多项选择题的Web应用程序

    谷歌师兄的leetcode刷题笔记MCQ 生成器 表中的内容 演示 关联: 图像 视频演示 概述 这是使用 Flask、机器学习、Docker ...问题以及错误的答案选择? 首先,用户提供文本并选择从全文或摘要生成 MCQ

    swiper.js手机端性格测试问答页面模板

    - 问题与选项:问答页面通常包含一系列问题,每个问题有多个可选答案。Swiper.js可以作为容器,每道问题作为一个slide,用户通过滑动查看下一个问题。 - 状态管理:模板可能包含记录用户选择的功能,使用...

Global site tag (gtag.js) - Google Analytics