这次我放的有一些是上次在腾讯soso部门碰到的,还有一些是上次去乐居碰到的我上个帖子中没有的题。零散的几道,大家也不必抱着为了面试的态度来看,我想人家那边应该是有题库,所以每次去的时候不一定都一样。
腾讯soso的一些题:1 <script src='http://www.xxx.com/xxx.js'>alert(123);</script>
请问上面的代码执行后会出现什么结果?alert(123)是否可以执行?如果不能的话,如何让他执行?
2 自己写一个js函数,实现trim的功能,要求尽可能的优化算法。3 写一个排序算法,并指出如何优化它?4 有一个分数表,其中每条数据中score字段的值默认都为5,现让实现一个算法,使得有20%的几率保持现有值变成7,30%的几率变成10,50%的几率保持不变。5 设计一个系统,使得在某些对象不再有用的情况下,及时自动释放掉它们。6 对于ajax跨域,把你知道几种方法都列出来。7 你理解js中闭包的原理吗?8 有50个红球,50个蓝球,有a,b两个篮子。问如何分配红球和蓝球,使得在只挑选一次的情况下,挑中红球的概率达到MAX?新浪乐居碰到的上次那份题中没有的题:1 javascript声明一个类有几种方法?都是什么?2 写一个函数,会随机返回0,1,2三个数,并且返回的这三个数的概率是可配置的,比如3:1:2。3 写一个正则表达式,找出一段文本中非sina.com本域及子域中的所有外部链接。分数我最后一定会结,希望大家多多来讨论。
腾讯soso的一些题:1 <script src='http://www.xxx.com/xxx.js'>alert(123);</script>
请问上面的代码执行后会出现什么结果?alert(123)是否可以执行?如果不能的话,如何让他执行?
2 自己写一个js函数,实现trim的功能,要求尽可能的优化算法。3 写一个排序算法,并指出如何优化它?4 有一个分数表,其中每条数据中score字段的值默认都为5,现让实现一个算法,使得有20%的几率保持现有值变成7,30%的几率变成10,50%的几率保持不变。5 设计一个系统,使得在某些对象不再有用的情况下,及时自动释放掉它们。6 对于ajax跨域,把你知道几种方法都列出来。7 你理解js中闭包的原理吗?8 有50个红球,50个蓝球,有a,b两个篮子。问如何分配红球和蓝球,使得在只挑选一次的情况下,挑中红球的概率达到MAX?新浪乐居碰到的上次那份题中没有的题:1 javascript声明一个类有几种方法?都是什么?2 写一个函数,会随机返回0,1,2三个数,并且返回的这三个数的概率是可配置的,比如3:1:2。3 写一个正则表达式,找出一段文本中非sina.com本域及子域中的所有外部链接。分数我最后一定会结,希望大家多多来讨论。
应该是其中一个篮子只有一个红球吧
请问上面的代码执行后会出现什么结果?alert(123)是否可以执行?如果不能的话,如何让他执行?这个我真不知道,这个题考查的是什么?一个无关紧要的细节?还是内有隐情,包含了某些js特性的原理?
2 自己写一个js函数,实现trim的功能,要求尽可能的优化算法。trim函数我们经常用,即去掉一个字符串两头的空格。那么这个题的思路应该是分别从字符串的两头开始查找空格,找到一个就去掉一个,当发现第一个不是空格的字符时或者长度到达字符串的一半时停止。如果只从一头开始找,一定会遍历整个字符串。从两头开始找,最坏的情况下会遍历字符串,但大多数情况下是不会的。
3 写一个排序算法,并指出如何优化它?我只知道冒泡,插入,替换,快速这四种排序应该针对不同情况进行选择。不知道它问的是不是这个意思。
4 有一个分数表,其中每条数据中score字段的值默认都为5,现让实现一个算法,使得有20%的几率保持现有值变成7,30%的几率变成10,50%的几率保持不变。我的想法是设置一个100个数的数组,并打乱这个数组,取一个随机数,根据上面的概率,当随机数在不同的范围内,将值更新为不同的值。
5 设计一个系统,使得在某些对象不再有用的情况下,及时自动释放掉它们。这个我真想不出来,一开始我都不知道问的是什么,面试的人说假如你自己写过框架,就会明白这个题是什么意思了。要用程序去判断我的一个对象下面是否还会用到而自动决定是否unset?我实在想不出来这如何判断。
6 对于ajax跨域,把你知道几种方法都列出来。
ajax跨域按我的理解应该分为两种吧。这两种的区别就是一种还是需要客户端js进行xmlhttp对象的异步请求。另一种是不需要做异步请求,而是利用某些标签内的特性。但他们又都是有一个共同点,那就是需要在客户端声明一个函数,并传给服务器端这个函数的名字,就是回调函数。服务器端的返回格式类似于callback(response)这样的形式。并且需要配合eval函数。
先说第一种,js不能跨域请求,但是服务器端脚本是可以的,我可以在我的js客户端本域内写一个php脚本,因为php是没有域限制的,所以利用它来向外域的脚本进行请求。客户端js异步请求的其实是我这个本域的php脚本,并传一个回调函数名给它。当这个php脚本请求并得到结果后,以callback(response)的形式返回给客户端,客户端就会立刻执行这个函数。归根结底,其实就是在客户端js与外域服务器端中间放了一个中间代理层,用它来完成js不能跨域请求的任务。
第二种其实就是常说的jsonp,利用<script>标签src属性没有域限制的特点,src属性的值就是外域的服务器端脚本,并且你要传一个回调函数名给他。之后它返回的格式也是callback(response)的形式。
第一种的客户端与服务器端的耦合度比较低,因为你本域的php脚本是你自己控制的。及时服务器端返回的格式不是你想要的,你也可以利用你的本域php中间层去过滤,去改变格式。
第二种需要客户端与服务器端的耦合度比较高,由于服务器端有可能是别人的,所以他返回什么格式你不可控。必须事先商量好才行。
7 你理解js中闭包的原理吗?
闭包说简单了,其实这是js的一个特性,可以在一个函数内部声明函数,这在其他语言中,至少是我熟悉的语言中是没有的。
主要是为了从函数外部去获得一个函数的内部变量的值。并且,可以让函数内的值始终保持在内存中。类似于下面的样子。function a(){
var myvar = 1;
function b(){
return myvar;
}
return b();
}有人会说那我不如直接让function a返回那个myvar了,但这是有区别的,假如function a内部有个myvar++。让a直接返回myvar,你会发现每次返回的值都是1,因为函数在重新进入后myvar的值会被var myvar=1重置。而闭包就很好的解决了这个问题。这里面涉及了js的链式关系和作用域问题。
8 有50个红球,50个蓝球,有a,b两个篮子。问如何分配红球和蓝球,使得在只挑选一次的情况下,挑中红球的概率达到MAX?这个题当时我还真蒙了,后来回来google了一下,才知道,学概率的朋友可能一眼就看出来了。答案就是:
a篮子放一个红球,b篮子放49和红球,50个蓝球。
那么只挑选一次的情况下,挑中红球的概率约等于75%。
a篮子:50%×100%,b篮子:50%*49/50
请问上面的代码执行后会出现什么结果?alert(123)是否可以执行?如果不能的话,如何让他执行?
有点怪,可以这样吗?在xxx.js加上
var
$scripts = document.getElementsByTagName('script');
for(var i=0,j=$scripts.length;i<j;i++)
{
if($scripts[i].innerHTML.match(/^\s*alert\(1\);?\s*$/i))
{
document.write('<'+'script>'+$scripts[i].innerHTML+'</script'+'>');
}
}
<script src="k.js" onload='eval(this.innerHTML);'>alert("123");</script>
k.js
var b=22;
alert(b);上面代码FF通过,IE不行,不知正确答案是什么
写出来的已经是尽量优化的代码,怎么样'并指出如何优化它'呢?
5 设计一个系统,使得在某些对象不再有用的情况下,及时自动释放掉它们。
一个系统?面试写一个系统,一个机制吧?这是考php的吗?还是js的?LZ是去面试WEB前端的工作吧?
概率忘掉了,是不是这样啊?$r = mt_rand(1,100);if($r <= 20) 变成7
elseif($r > 20 && $r <= 50) 变成10
else{不变}
<script src="http://www.termwiki.com/skins/common/jquery-ui/js/jquery-1.4.2.min.js" onreadystatechange='if(!window["al"]){eval(this.innerHTML);window["al"]=true}' onload='eval(this.innerHTML)'>alert(1)</script>
关于第三题我也不太明白到底什么意思,是说让我自己写一个排序算法并指出如何优化它,还是让我拿出一个公认的排序算法指出如何优化?第5题是php的题,应该是类似于垃圾回收机制的东西吧。我记得当时他和我说的似乎是:
假如:
$obj = new class1();
$obj->foo();
...
...
?>我并没有在代码的某一行开始不再使用这个对象时去unset这个对象。那么我们设计这个系统就会自动去帮忙释放这个对象。在我看来,这个系统是否指的是像c语言的预处理命令那样,会预处理一下代码。其实php的在解释代码前也有预处理的行为。比如语法检查,都是在解释前进行的。
那么这个题如果按照这种方式理解,我应该检查下代码下面从哪一行开始不再使用这个对象并且还要检查是否有这个对象的相关拷贝等操作。如果没有了,就帮忙unset掉它。自己写框架的话,可能需要去写这种垃圾回收机制吧。
通用文件
gc.php
--------
register_shutdown_function(array('gc','clean'));class gc
{
function clean()
{
foreach($GLOBALS as $k=>$v)
{
if(is_object($v))
{
unset($GLOBALS[$k]);
}
}
}
}代码页面
include_once('gc.php');
$obj = new class1();
$obj->foo();
MARK
and
UP
register_shutdown_function当执行关闭时可以被调用的另一个函数.也就是说当我们的脚本执行完成或意外死掉导致PHP执行即将关闭时,我们的这个函数将会被调用。似乎还是无法做到最及时的去释放不需要的对象。
关键在于,在没有显示的unset或析构某个对象时,如何知道此对象将在某行代码以下不再使用。我的理解就是要预处理下整个代码才能知道。
没错,如果说按我的理解,就是在你的框架中,有一个模块专门负责分析每一个php代码,先把代码读出来,然后开始逐行的读取代码,分析处理。但用php去处理这个,效率问题就被无情的忽视了。而且我觉得如果这个真的需要这样实现的话,应该是GC机制的事情,而不应该让应用层去处理这个。应该跟API反射没关系,它需要处理的是一个php文件中的代码逻辑。
或者这样,查找第一个不是空格的字符,这涉及正则.正则的效率或刚好符合这个.从前匹配,用非贪懒模式,
检测后面,用贪懒模式,正好是一个意思.
即不要有多余的重复计算,
这在js比较明显
for(var i=0,num=arr.length;i<num;i++){ }
要然要快过
for(var i=0,i<arr.length;i++){ } 不知是不是这个意思
8 有50个红球,50个蓝球,有a,b两个篮子。问如何分配红球和蓝球,使得在只挑选一次的情况下,挑中红球的概率达到MAX?2 写一个函数,会随机返回0,1,2三个数,并且返回的这三个数的概率是可配置的,比如3:1:2。
-------------------------------------算法不太熟,但看了一下,不少面试题都考到概率算法,这说明概率算法应用还是比较多的.因此,这个题还是有深意的.
基本上是考概率控制,可以惜大学里学的忘的差不多了.找了一下相关资料,简单易懂的不多.但想了想,这种事件基本上是要模拟概率事件,才能有结果.
$a=array(0,2,5); //事件
$b=array(50,20,30); //概率试验100次
for($i=0;$i<50;$i++){
$c[]=$a[0];
}for($i=0;$i<20;$i++){
$c[]=$a[1];
}for($i=0;$i<30;$i++){
$c[]=$a[2];
}//第一种方式,从中随机1地取一作为下标
//print_r($c);
$sub =array_rand($c,1);
echo $o+$c[$sub];
//第二种方式shuffle($c) ; //这一个可做可不做
$sub=rand(0,99);echo $o+ $c[$sub];
来源参考http://www.zzxj.net/blog/fxs_2008/archive/2010/06/26/174.html
第二种方式,打开浏览器安全中的相关项允许跨域(但你可能控制客户端);
第三种,据说json可以伪装跨域
第四种,js有web服务,应能跨域
他也可能是问的是js类几种工厂模式.
<javascript 高级程序设计>有专门一章.
请问上面的代码执行后会出现什么结果?alert(123)是否可以执行?如果不能的话,如何让他执行?的确如前面说的,有src不能有内容
2 自己写一个js函数,实现trim的功能,要求尽可能的优化算法。
去除前后空格用正则
str.replace(/(^\s*)|(\s*$)/g, '');
这代码已经很简单了,不知是否有高人还能优化。3 写一个排序算法,并指出如何优化它?
排序算法有很多,教课书上的排序都是经典排序,没什么优化空间了。要优化可能要从读取数据,内存占用去优化,4 有一个分数表,其中每条数据中score字段的值默认都为5,现让实现一个算法,使得有20%的几率保持现有值变成7,30%的几率变成10,50%的几率保持不变。
算法:产生一个随机数范围1--10
if(1--2)str.replace(/(^\s*)|(\s*$)/g, '');
if(3--5 )变成10
if(6--10)保持不变5 设计一个系统,使得在某些对象不再有用的情况下,及时自动释放掉它们。
这涉及到编译原理里的超前扫描。不熟悉。6 对于ajax跨域,把你知道几种方法都列出来。
一、由服务器读取其他域
二、<script type="text/javascript" src="其它域的js"></script>
获得json7 你理解js中闭包的原理吗?
不是太明白感觉有点绕,而且很多书里也不提。8 有50个红球,50个蓝球,有a,b两个篮子。问如何分配红球和蓝球,使得在一只挑选次的情况下,挑中红球的概率达到MAX?
什么叫MAX?看不懂题。MAX=50 or 49 ......."只挑选次的情况下"是要我挑球呢还是挑篮子?
感觉这题目出得太垃圾。
改
if(1--2)保持现有
不管怎么放挑中红球的概率都等于50%
1)如果截取大于字符串的长度则返回$str
2)<em>和</em>不包含在长度计算范围。
例:
如果CutStr("aaa<em>sss</em>ddd",7) 则返回aaa<em>sss</em>d
如果CutStr("aaa<em>sss</em>ddd",4) 则返回aaas
呵呵,如果CutStr("aaa<em>sss</em>ddd",3) 返回aaa<em>么?
$str = "aaa<em></em><td><em></em></td>ssss</em>ddd";
for($i = 0; $i< 20; $i++)
{
echo '<br />' . htmlspecialchars(CutString($str, $i));
}
/**
* 截特定条件的字符串,
* 如果我笔试遇到……估计不会用preg_split,有印象,但没那么熟悉
* 关键用了preg_split
* @param string $str 被截取的字符串
* @param int $len 截取的长度
*
* @return string
*/
function CutString($str = '', $len = 0)
{
$arr = preg_split('/<em>|<\/em>/', $str, -1, PREG_SPLIT_OFFSET_CAPTURE);
//preg_split PREG_SPLIT_OFFSET_CAPTURE将返回二维数组,第二维是截取的字符串,和在$str中的起始位置,不熟悉查手册
$length = 0;
foreach($arr AS $s)
{
$tempLength = strlen($s[0]);
if($length + $tempLength < $len)
{
$length += $tempLength;
continue;
}
else
{
return substr($str, 0, $len - $length + $s[1]);
}
}
}
{
$arr = preg_split('/<em>|<\/em>/', $str, -1, PREG_SPLIT_OFFSET_CAPTURE);
$length = 0;
foreach($arr AS $s)
{
$tempLength = strlen($s[0]);
if($length + $tempLength < $len)
{
$length += $tempLength;
continue;
}
else
{
return substr($str, 0, $len - $length + $s[1]);
}
}
return $str;//前面回复的,没返回,悲剧啊,,,,祝大家看球开心
}
不错啊,受教了!这个题有意思的地方是说难就难,至少这个函数已解决了的差不多了.
如果考官要求<em>xxx</em>之类的标签必须成对出现(有实际意义),问题立马复杂了.当然还有更难的,如果允许标签嵌套(许多网页截取软件都有这个功能).
这题其实还有要求,假如截取的字符正巧在两个<em>标签之间,要求去掉与之相匹配的那个标签。比如<em>12345</em>,假如正巧截取到<em>123,那么要求去掉前面的<em>,只返回123。假如代码是规则的话,<em>标签应该没有嵌套的情况发生的。所以其实不用去考虑嵌套的问题。
用preg_match_all把<em></em>中的词提到数组,然后str_replace去掉em标签,然后截取,然后在把取出的词套上<em>标签。。
不过有几个问题:一个是同一词可能不一定都套了<em>,再就是词包含词的情况。。
function filterEm($str, $index)
{
$strCount = strlen($str);
$rtnStr = '';
$unmatchCount = 0; // 未匹配计数
$emIndex = array(); // tag <em> 匹配索引
$effectiveCount = 0; // 有效计数
$filterEndEmCount = 0;
for($i = 0; $i < $strCount; ++$i)
{
if($str[$i] == '<')
{
if($str[$i + 1] == 'e' && $str[$i + 2] == 'm' && $str[$i + 3] == '>')
{
$rtnStr .= '<em>';
$emImdex = array_push($emIndex, ($i - 5 * $filterEndEmCount));
$i += 3;
++$unmatchCount; // 未闭包<em>数加1
}
if($str[$i + 1] == '/' && $str[$i + 2] == 'e' && $str[$i + 3] == 'm' && $str[$i + 4] == '>')
{
if($unmatchCount > 0)
{
$rtnStr .= '</em>';
--$unmatchCount; // 未闭包<em>数减1
}
++$filterEndEmCount;
$i += 4;
}
continue;
}
$rtnStr .= $str[$i];
++$effectiveCount;
if($effectiveCount >= $index) break;
} if($unmatchCount > 0) // 过滤未闭包<em>
{
$tmpStr = $rtnStr;
$rtnStr = '';
$tmpStrCount = strlen($tmpStr);
$count = 0; for($i = 0; $i < $tmpStrCount; ++$i)
{
if($i == $emIndex[$count] && $count < $unmatchCount)
{
$i += 3;
++$count;
continue;
}
$rtnStr .= $tmpStr[$i];
}
} return $rtnStr;
}
// 题目要求的结果
echo htmlentities(filterEm("aaa<em>sss</em>ddd", 7)) . '<br>';
echo htmlentities(filterEm("aaa<em>sss</em>ddd", 4)) . '<br>';// 处理异常匹配
echo htmlentities(filterEm("aa</em>a<em>sss</em>ddd", 7)) . '<br>';
echo htmlentities(filterEm("aa</em>a<em>sss</em>ddd", 4)) . '<br>';// 嵌套匹配
echo htmlentities(filterEm("aaa<em>sss<em>xxx</em>yyyy</em>ddd", 10)) . '<br>';
运行结果
aaa<em>sss</em>d
aaas
aaa<em>sss</em>d
aaas
aaasss<em>xxx</em>y
function filterEm($str, $index)
{
$strCount = strlen($str);
$rtnStr = '';
$unmatchCount = 0; // 未匹配计数
$emIndex = array(); // tag <em> 匹配索引
$effectiveCount = 0; // 有效计数
$filterEndEmCount = 0;
for($i = 0; $i < $strCount; ++$i)
{
if($str[$i] == '<')
{
if($str[$i + 1] == 'e' && $str[$i + 2] == 'm' && $str[$i + 3] == '>')
{
$rtnStr .= '<em>';
$emImdex = array_push($emIndex, ($i - 5 * $filterEndEmCount));
$i += 3;
++$unmatchCount; // 未闭包<em>数加1
}
if($str[$i + 1] == '/' && $str[$i + 2] == 'e' && $str[$i + 3] == 'm' && $str[$i + 4] == '>')
{
if($unmatchCount > 0)
{
$rtnStr .= '</em>';
--$unmatchCount; // 未闭包<em>数减1
}
else
++$filterEndEmCount;
$i += 4;
}
continue;
}
$rtnStr .= $str[$i];
++$effectiveCount;
if($effectiveCount >= $index) break;
} if($unmatchCount > 0) // 过滤未闭包<em>
{
$tmpStr = $rtnStr;
$rtnStr = '';
$tmpStrCount = strlen($tmpStr);
$count = 0; for($i = 0; $i < $tmpStrCount; ++$i)
{
if($i == $emIndex[$count] && $count < $unmatchCount)
{
$i += 3;
++$count;
continue;
}
$rtnStr .= $tmpStr[$i];
}
} return $rtnStr;
}// 题目要求的结果
echo htmlentities(filterEm("aaa<em>sss</em>ddd", 7)) . '<br>';
echo htmlentities(filterEm("aaa<em>sss</em>ddd", 4)) . '<br>';// 处理异常匹配
echo htmlentities(filterEm("aa</em>a<em>sss</em>ddd", 7)) . '<br>';
echo htmlentities(filterEm("aa</em>a<em>sss</em>ddd", 4)) . '<br>';// 嵌套匹配
echo htmlentities(filterEm("aaa<em>sss<em>xxx</em>yyyy</em>ddd", 10)) . '<br>';// 嵌套异常匹配
echo htmlentities(filterEm("aaa<em>sss<em>xxx</em>yyyy</em></em>ddd", 15)) . '<br>';
?>
运行结果:
aaa<em>sss</em>d
aaas
aaa<em>sss</em>d
aaas
aaasss<em>xxx</em>y
aaa<em>sss<em>xxx</em>yyyy</em>dd
function filterEm($str, $index)
{
$strCount = strlen($str);
$rtnStr = '';
$unmatchCount = 0; // 未匹配计数
$emIndex = array(); // tag <em> 匹配索引
$effectiveCount = 0; // 有效计数
$filterEndEmCount = 0;
for($i = 0; $i < $strCount; ++$i)
{
if($str[$i] == '<')
{
if($str[$i + 1] == 'e' && $str[$i + 2] == 'm' && $str[$i + 3] == '>')
{
$rtnStr .= '<em>';
$emImdex = array_push($emIndex, ($i - 5 * $filterEndEmCount));
$i += 3;
++$unmatchCount; // 未闭包<em>数加1
}
if($str[$i + 1] == '/' && $str[$i + 2] == 'e' && $str[$i + 3] == 'm' && $str[$i + 4] == '>')
{
if($unmatchCount > 0)
{
$rtnStr .= '</em>';
array_pop($emIndex);
--$unmatchCount; // 未闭包<em>数减1
}
else
++$filterEndEmCount;
$i += 4;
}
continue;
}
$rtnStr .= $str[$i];
++$effectiveCount;
if($effectiveCount >= $index) break;
} if($unmatchCount > 0) // 过滤未闭包<em>
{
$tmpStr = $rtnStr;
$rtnStr = '';
$tmpStrCount = strlen($tmpStr);
$count = 0; for($i = 0; $i < $tmpStrCount; ++$i)
{
if($i == $emIndex[$count] && $count < $unmatchCount)
{
$i += 3;
++$count;
continue;
}
$rtnStr .= $tmpStr[$i];
}
} return $rtnStr;
}// 题目要求的结果
echo htmlentities(filterEm("aaa<em>sss</em>ddd", 7)) . '<br>';
echo htmlentities(filterEm("aaa<em>sss</em>ddd", 4)) . '<br>';// 处理异常匹配
echo htmlentities(filterEm("aa</em>a<em>sss</em>ddd", 7)) . '<br>';
echo htmlentities(filterEm("aa</em>a<em>sss</em>ddd", 4)) . '<br>';// 嵌套匹配
echo htmlentities(filterEm("aaa<em>sss<em>xxx</em>yyyy</em>ddd", 10)) . '<br>';// 嵌套异常匹配
echo htmlentities(filterEm("aaa<em>sss<em>xxx</em>yyyy</em></em>ddd", 15)) . '<br>';
echo htmlentities(filterEm("aaa<em>sss<em>xxx</em>yyyy</em><em>ddd", 15)) . '<br>';
?>
运行结果:
aaa<em>sss</em>d
aaas
aaa<em>sss</em>d
aaas
aaasss<em>xxx</em>y
aaa<em>sss<em>xxx</em>yyyy</em>dd
aaa<em>sss<em>xxx</em>yyyy</em>dd
请问上面的代码执行后会出现什么结果?alert(123)是否可以执行?如果不能的话,如何让他执行?不是分成2行就行了么?
<script src='http://www.xxx.com/xxx.js'></script>
<script language="javascript">alert(123);</script>