大公司的PHP面试题
大公司的PHP面试题
1. 禁用COOKIE 后 SEESION 还能用吗?
2. 抓取远程图片到本地,你会用什么函数?
4. 你觉得在pV10W的时候, 同等配置下,LUNIX 比WIN快多少?
5. 简述pOST 和GET传输的最大容量分别是多少?
6. 用最少的代码写一个求3值最大值的函数.
以下是部分答案(不保证是正确的解)
1. 不能
2 fsockopen
4 (不做优化的情况下一样)
5 2MB,1024B
6 function($a,$b,$c){
return $a>$b? ($a>$c? $a : $c) : ($b>$c? $b : $c );
}
———————————————————————————–
大公司的pHp面试题
2. 求两个日期的差数,例如20_-2-5 ~ 20_-3-6 的日期差数
$begin=strtotime(‘20_-2-5′);
$end=strtotime(‘20_-3-6′);
echo ($end-$begin)/(24*3600);
3. 请写一个函数,实现以下功能:
字符串“open_door” 转换成 “OpenDoor”、”make_by_id” 转换成 ”MakeById”。
function str_change($str) {
$str = str_replace ( “_”, ” “, $str );
$str = ucwords ( $str );
$str = str_replace ( ” “, “”, $str );
return $str; }
4. 要求写一段程序,实现以下数组$arr1转换成数组$arr2:
$arr1 = array (
‘0′ => array (‘fid’ => 1, ‘tid’ => 1, ‘name’ =>’Name1′ ),
‘1′ => array (‘fid’ => 1, ‘tid’ => 2 , ‘name’ =>’Name2′ ),
‘2′ => array (‘fid’ => 1, ‘tid’ => 5 , ‘name’ =>’Name3′ ),
‘3′ => array (‘fid’ => 1, ‘tid’ => 7 , ‘name’ =>’Name4′ ),
‘4′ => array (‘fid’ => 3, ‘tid’ => 9, ‘name’ =>’Name5′ )
);
$arr2 = array (
‘0′ => array (
‘0′ => array ( ‘tid’ => 1, ‘name’ => ‘Name1′),
‘1′ => array ( ‘tid’ => 2, ‘name’ => ‘Name2′),
‘2′ => array ( ‘tid’ => 5, ‘name’ => ‘Name3′),
‘3′ => array ( ‘tid’ => 7, ‘name’ => ‘Name4′) ),
‘1′ => array (
‘0′ => array ( ‘tid’ => 9, ‘name’ => ‘Name5′ ) ) );
$arr1 = array (
‘0′ => array (‘fid’ => 1, ‘tid’ => 1, ‘name’ =>’Name1′ ),
‘1′ => array (‘fid’ => 1, ‘tid’ => 2 , ‘name’ =>’Name2′ ),
‘2′ => array (‘fid’ => 1, ‘tid’ => 5 , ‘name’ =>’Name3′ ),
‘3′ => array (‘fid’ => 1, ‘tid’ => 7 , ‘name’ =>’Name4′ ),
‘4′ => array (‘fid’ => 3, ‘tid’ => 9, ‘name’ =>’Name5′ )
);
function changeArrayStyle($arr){
foreach($arr as $key=>$value){
$result[$value[\fid\]][]=$value;
}
return array_values($result);
}
$arr2=changeArrayStyle($arr1);
echo “
”;
var_dump($arr2);
?>
5. 请简述数据库设计的范式及应用。
一般第3范式就足以,用于表结构的优化,这样做既可以避免应用程序过于复杂同时也避免了SQL语句过于庞大所造成系统效率低下。
ANSWER:
第一范式:若关系模式R的每一个属性是不可再分解的,再属于第一范式。
第二范式:若R属于第一范式,且所有的非码属性都完全函数依赖于码属性,则为第二范式。
第三范式:若R属于第二范式,且所有的非码属性没有一个是传递函数依赖于候选码,则属于第三范式。
6.一个表中的Id有多个记录,把所有这个id的记录查出来,并显示共有多少条记录数,用SQL语句及视图、存储过程分别实现。
存储过程:
DELIMITER //
create procedure proc_countNum(in columnId int,out rowsNo int)
begin
select count(*) into rowsNo from member where member_id=columnId;
end
call proc_countNum(1,@no);
select @no;
视图:
create view v_countNum as select member_id,count(*) as countNum from member group by member_id
select countNum from v_countNum where member_id=1
7 表中有A B C三列,用SQL语句实现:当A列大于B列时选择A列否则选择B列,当B列大于C列时选择B列否则选择C列。
select
case
when first_name>middle_name then
case when first_name>last_name then first_name
else last_name end
else
case when middle_name>last_name then middle_name else last_name
end
end as name
from member
8请简述项目中优化sql语句执行效率的方法,从哪些方面,sql语句性能如何分析?
sql优化有鸟用,不如直接加索引。
9 如果模板是用smarty模板。怎样用section语句来显示一个名为$data的数组。比如:
$data = array(
[0] => array( [id]=8 [name]=’name1′)
[1] => array( [id]=10 [name]=’name2′)
[2] => array( [id]=15 [name]=’name3′)
……
)
写出在模板页的代码? 若用foreach语句又要怎样显示呢?
{section name=loop loop=$data}
{$data[loop].id}
{$data[loop].name}
{/section}
{foreach from=$data item=id key=k}
{$k} – {$id}
{/foreach}
10 写一个函数,能够遍历一个文件夹下的所有文件和子文件夹。(目录操作)
$d = dir(dirname(__file__));
//echo “Handle: ” . $d->handle . “\\n”;
//echo “path: ” . $d->path . “\\n”;
while ( false !== ($entry = $d->read ()) ) {
echo $entry . “”;
}
$d->close ();
?>
11 两张表 city表和province表。分别为城市与省份的关系表。
city:
id City provinceid
1 广州 1
2 深圳 1
3 惠州 1
4 长沙 2
5 武汉 3
………. 广州
province:
id province
1 广东
2 湖南
3 湖北
……….
(1) 写一条sql语句关系两个表,实现:显示城市的基本信息。?
(2) 显示字段:城市id ,城市名, 所属省份 。
如:
Id(城市id) Cityname(城市名) privence(所属省份)
。。。。。。。。。
。。。。。。。。。
(2)如果要统计每个省份有多少个城市,请用group by 查询出来。?
显示字段:省份id ,省份名,包含多少个城市。
ANSWER:
1.select A.id,A.Cityname,B.province from city A,province B where A.provinceid=B.id
2.select B.id,B.province,count(*) as num from city A,province B where A.provinceid=B.id group by B.id
12. 按照你的经验请简述软件工程进行软件开发的步骤。以下工具Rational Rose、powerDesigner、project、VSS或CVS、TestDirector使用过那种,有缺点是什么?
公司用dbdesigner及cvs,测试管理工具用的是Mantis
13. 请简述操作系统的线程与进程的区别。列举LINUX下面你使用过的软件?
14. 请使用伪语言结合数据结构冒泡排序法对以下一组数据进行排序 10 2 36 14 10 25 23 85 99 45。
$a = array(10,2,36,14,10,25,23,85,99,45);
for($j=0 ; $j<9 ; $j++)
for($i=0 ; $i<9-$j ; $i++)
if($a[$i] > $a[$i+1]) {
$t = $a[$i] ;
$a[$i] = $a[$i+1] ;
$a[$i+1] = $t ; }
echo var_dump($a);
—————————————————————————–
—————————————————————————–
—————————————————————————–
新浪php工程师面试题 收藏
1、COOKIE、SESSION的联系和区别,多台web服务器如何共享SESSION?
2、HTTp协议中的pOST和GET有何区别?
3、一段php代码,写出输出结果:
/**** 这个程序****/
$a=0;
$b=0;
if(($a=3)>0||($b=3)>0){
$a++;
$b++;
echo $a ;
echo $b; //输出b的值 ($a=4 ,$b=1) $b=3没有执行
}
4、reqiure的include都可包含文件,二者的区别何在?
5、php中WEB上传文件的原理是什么,如何限制上传文件的大小?
is_uploaded_file() 和 move_uploaded_file()
6、写一个函数,可以遍历文件夹下的所有文件和文件夹.
7、8、中间有几个unix shell的题目(好像是两个),因为不懂,不记得这些题目了
9、有mail.log的一个文档,内容为若干邮件地址,其中用’\\n’将邮件地址分隔。要求从中挑选出sina.com的邮件地址(包括从文件读取、过滤到列印出来)。
mail.log内容如下:
james@sina.com.cn
jack@163.com
zhansan@sohu.com
lisi@hotmail.com
wangwu@gmail.com
10、js中网页前进和后退的代码 ( 前进: history.forward();=history.go(1); 后退: history.back();=history.go(-1); )
11、window(A)中用window.open()打开了window(B),如何从窗口B调用窗口A中的内容?A、B仅仅是窗口的代号,不是窗口名字
12、了解ajax吗?用过吗?……
13、什么是MVC?用过吗?使用时遇到了什么问题,怎么解决的?
14.写出 访问 http://www.sina.com.cn 所需的报文头,嘿嘿,这是超级猪自己想起来地。md5_file()
—————————————————————————–
—————————————————————————–
—————————————————————————–
最新的新浪pHp面试题(20_.3)
1. echo count(“abc”); 输出什么?
答案:1
2. 用pHp写出显示客户端Ip与服务器Ip的代码
答案:客户端 getenv(‘REMOTE_ADDR’);
服务器端 getenv(‘SERVER_ADDR’); // gethostbyname(“www.baidu.com”);
3. error_reporting(2047)什么作用?
答案:相当于 error_reporting(‘E_ALL’); 输出所有的错误
4.如何实现pHp、JSp交互?
题目有点含糊不清,SOAp,XML_RpC,Socket function,CURL都可以实现这些,如果是考pHp和Java的整合,pHp内置了这种机制(如果考pHp和.NET的整合,也可以这么回答), 例如$foo = new Java(‘java.lang.System’);
5. 打开php.ini中的Safe_mode,会影响哪些参数?至少说出6个。
答案:此模块打开时,php将检查当前脚本的拥有者是否和被操作文件的拥有者相同,因此,将影响文件操作类函数,程序执行函数(program Execution Functions)。这些函数有.pathinfo,basename,fopen,system,exec,proc_open 等函数;
7. 请写一个函数验证电子邮件的格式是否正确(要求使用正则)
function checkEmail($mail){
$reg = ‘/^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$/’;
$rst = preg_match($reg , $mail);
if($rst){
return TRUE;
}else {
return FALSE;
}
}
11. 写个函数用来对二维数组排序。
array_multisort()
12. 写5个不同的自己的函数,来截取一个全路径的文件的扩展名,允许封装php库中已有的函数。
13. 一群猴子排成一圈,按1,2,…,n依次编号。然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去…,如此不停的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫做大王。要求编程模拟此过程,输入m、n, 输出最后那个大王的编号
7、优化MYSQL数据库的方法。
(1).数据库设计方面,这是DBA和Architect的责任,设计结构良好的数据库,必要的时候,去正规化(英文是这个:denormalize,中文翻译成啥我不知道),允许部分数据冗余,避免JOIN操作,以提高查询效率
(2).系统架构设计方面,表散列,把海量数据散列到几个不同的表里面.快慢表,快表只留最新数据,慢表是历史存档.集群,主服务器Read & write,从服务器read only,或者N台服务器,各机器互为Master
(3).(1)和(2)超越pHp programmer的要求了,会更好,不会没关系.检查有没有少加索引
(4).写高效的SQL语句,看看有没有写低效的SQL语句,比如生成笛卡尔积的全连接啊,大量的Group By和order by,没有limit等等.必要的时候,把数据库逻辑封装到DBMS端的存储过程里面.缓存查询结果,explain每一个sql语句
(5).所得皆必须,只从数据库取必需的数据,比如查询某篇文章的评论数,select count(*) … where article_id = ? 就可以了,不要先select * … where article_id = ?然后msql_num_rows.
只传送必须的SQL语句,比如修改文章的时候,如果用户只修改了标题,那就… set title = ? where article_id = ?不要set content = ?(大文本)
(6).必要的时候用不同的存储引擎.比如InnoDB可以减少死锁.HEAp可以提高一个数量级的查询速度
————————————————————————
$s = ‘abc’;
if ($s==0)
echo ‘is zero’;
else
echo ‘is not zero’;
?>
好多人答错了,认为答案是输出字符串“is not zero”。其实正确答案应该是输出字符串“is zero”。
原因其实简单,因为 pHp 是一门弱类型的语言,它对变量没有“必须先定义再使用”的强制要求,变量的类型也是根据赋值的类型来灵活变化的。这一“灵活性”看似灵活,实际上埋下了错误的隐患。虽然 $s = ‘abc’; 语句定义了变量 $s 为字符串类型,但因为 if ($s==0)语句中,$s 是和数字型常量比较,所以 $s 这时被隐含的转换成了数字型变量,其值是 0,所以 $s==0 比较的结果就为真。
犯这一类型错误的人一般是从 Java、C 等语言转到 pHp 开发的程序员,因为 Java、C 等语言是强类型语言,是不允许不同类型的变量和常量相互比较的,在这种情况下会报告语法错误。
其实 pHp 语言的开发者并不是没有注意到这类问题,在 pHp 语言里还有一个严格比较的运算符“===”,要求比较的双方必须类型一致,把上述 if ($s==0) 语句写为 if ($s===0) 就会避免前述错误的发生。
———————————————————————————–
$str=”cd”;
$$str=”hotdog”; //$cd
$$str.=”ok”;
echo $cd; //hotdogok
?>
————————————————————————————–
9、 apache+mysql+php实现最大负载的方法
主要是配置文件的优化了,另外用linux跑要比用windows跑效果好一点。
mkdir创建目录 touch创建文件夹 修改权限chmod之类
51、请写出pHp5权限控制修饰符(3分)
private protected public
13、对于大流量的网站,您采用什么样的方法来解决访问量问题?(4分)
首先,确认服务器硬件是否足够支持当前的流量
其次,优化数据库访问。
第三,禁止外部的盗链。
第四,控制大文件的下载。
第五,使用不同主机分流主要流量
第六,使用流量分析统计软件。
htmlspecialchars() 函数把一些预定义的字符转换为 HTML 实体。
htmlentities() 函数把字符转换为 HTML 实体。(htmlentities( )的转义更为彻底。)
SQL注入是很容易避免的。正如第一章所提及的,你必须坚持 过滤输入和转义输出。———
microtime 返回当前时间戳, mktime()取得指定的时间戳
//本页地址,当前脚本的名称.
echo $_SERVER[\pHp_SELF\].””;
//链接到当前页面的前一页面的 URL 地址:
echo $_SERVER[\HTTp_REFERER\].””;
3.在HTTp 1.0中,状态码 401 的含义是(4);如果返回“找不到文件”的提示,则可用 header 函数,
其语句为(5)。
(4)未授权 (5) header(“HTTp/1.0 404 Not Found”);———找不到文件
header(“HTTp/1.1 403 Forbidden”);———不允许访问
7.以Apache模块的方式安装pHp,在文件http.conf中首先要用语句(10)动态装载pHp模块,
然后再用语句(11)使得Apache把所有扩展名为php的文件都作为pHp脚本处理。
(10) LoadModule php5_module “c:/php/php5apache2.dll”
(11) AddType application/x-httpd-php-source .phps
AddType application/x-httpd-php .php .php5 .php4 .php3 .phtml
9.类的属性可以序列化后保存到 session 中,从而以后可以恢复整个类,这要用到的函数是(14)。
serialize() /unserialize()
10.一个函数的参数不能是对变量的引用,除非在php.ini中把(15)设为on.
allow_call_time_pass_reference
问题:请用最简单的语言告诉我PHP是什么?
回答:PHP全称:Hypertext Preprocessor,是一种用来开发动态网站的服务器脚本语言。
问题:什么是MVC?
回答:MVC由Model(模型), View(视图)和Controller(控制器)组成,PHP MVC可以更高效地管理好3个不同层的PHP代码。
Model:数据信息存取层。
View:view层负责将应用的数据以特定的方式展现在界面上。
Controller:通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。
问题:在页面中引用CSS有几种方式?
回答:在页面中使用CSS有3中方式:
引用外部CSS文件
内部定义Style样式
内联样式
问题:PHP支持多继承吗?
回答:不可以。PHP类只能继承一个父类,并用关键字“extended”标识。
问题:请问PHP中echo和print有什么区别?
这两个看起来很相似,因为它们都是将一些值打印在屏幕上。但是echo和print的本质区别在于:echo用来输出字符串,显示多个值的时候可以用逗号隔开。只支持基本类型,print不仅可以打印字符串值,而且可以打印函数的返回值。
问题:请问GET和POST方法有什么区别?
回
答:我们再网页上填写的表单信息都可以通过这两个方法将数据传递到服务器上,当我们使用GET方法是,所有的信息都会出现在URL地址中,并且使用GET
方法最多只能传递1024个字符,所以如果在传输量小或者安全性不那么重要的情况下可以使用GET方法。说到POST方法,最多可以传输2MB字节的数
据,而且可以根据需要调节。
问题:PHP中获取图像尺寸大小的方法是什么?
回答:getimagesize () 获取图片的尺寸
Imagesx () 获取图片的宽度
Imagesy () 获取图片的高度
问题:PHP中的PEAR是什么?
回答:PEAR也就是为PHP扩展与应用库(PHP Extension and Application Repository),它是一个PHP扩展及应用的一个代码仓库。
问题:如何用PHP和MySQL上传视频?
回答:我们可以在数据库中存放视频的地址,而不需要将真正的视频数据存在数据库中。可以将视频数据存放在服务器的指定文件夹下,上传的默认大小是2MB,但是我们也可以在php.ini文件中修改max_file size选项来改变。
问题:PHP中的错误类型有哪些?
回答:PHP中遇到的错误类型大致有3类。
提示:这都是一些非常正常的信息,而非重大的错误,有些甚至不会展示给用户。比如访问不存在的变量。
警告:这是有点严重的错误,将会把警告信息展示给用户,但不会影响代码的输出,比如包含一些不存在的文件。
错误:这是真正的严重错误,比如访问不存在的PHP类。
问题:如何在PHP中定义常量?
回答:PHP中使用Define () 来定义常量。
define (“Newconstant”, 30);
问题:如何不使用submit按钮来提交表单?
如果我们不想用submit按钮来提交表单,我们也可以用超链接来提交,我们可以这样写代码:
Submit Me
扎实的基础知识、高质量的代码、清晰的思路、优化代码的能力、优秀的综合能力是编程技术面试的五大要点。
找工作一直是一个热门话题。要想找到心仪的工作,难免需要经过多轮面试。编程面试是程序员面试过程中最为重要的一个环节。如果能在编程面试的环节充分展示自己的能力,那么拿到中意的Offer就是水到渠成的事情。
我先后在欧特克、微软和思科等公司任软件工程师,多次接受他人的面试,同时也面试过很多人。总结面试与被面试的经验,我发现尽管面试官的背景、性格各不相同,但都关注应聘者五种素质:扎实的基础知识;能写高质量的代码;分析问题时思路清晰;能优化时间效率和空间效率;具备包括学习能力、沟通能力、发散思维能力等在内的综合能力。
扎实的基础知识
扎实的基本功是成为优秀程序员的前提条件,因此面试官首要关注应聘者的素质即是否具备扎实的基础。通常基本功在编程面试环节体现在两个方面:一是编程语言,二是数据结构和算法。
每个程序员至少要熟练掌握1~2门编程语言。面试官从应聘者在面试过程中写的代码以及跟进的提问中,能看出他编程语言掌握的熟练程度。以大部分公司面试要求的C++为例,如果函数需要传入一个指针,面试官可能会问是否需要为该指针加上const,把const加在指针不同的位置有什么区别;如果写的函数需要传入的参数是一个复杂类型的实例,面试官可能会问传入值参数或者引用参数有什么区别,什么时候需要为传入的引用参数加上const。
数据结构通常是编程面试过程中考查的重点。在参加面试之前,应聘者需要熟练掌握链表、树、栈、队列以及哈希表等数据结构以及它们的操作。如果我们留心各大公司的面试题,就会发现链表和二叉树相关的问题是很多面试官喜欢问的问题。这方面的问题看似简单,但真正掌握也很不容易,特别适合在短短几十分钟的面试时间内检验应聘者的基本功。如果应聘者事先对链表的插入和删除结点了如指掌,对二叉树的各种遍历方法的循环和递归写法都烂熟于胸,那么真正到了面试时也就游刃有余了。
大部分公司对算法的要求都只是考查查找和排序。应聘者可以在了解各种查找和排序算法的基础上,重点掌握二分查找、归并排序和快速排序,因为很多面试题都只是这些算法的变体而已。比如把排序好的数组的前面若干个数字移到数组的后面,然后问怎样在这个数组之中找到最小的数字。这道题其本质就是考查二分查找。少数对算法很重视的公司比如谷歌或者百度,还会要求应聘者熟练掌握动态规划和贪婪算法。如果对这种类型的公司感兴趣,那么应聘者在参加面试之前就应该加强对相关算法题目的练习。
高质量的代码
只有注重质量的程序员,才能写出鲁棒稳定的大型软件。在面试过程中,面试官总会格外关注边界条件、特殊输入等看似细枝末节但实质至关重要的地方,以此来分析应聘者是否注重代码质量。很多时候,面试官发现应聘者写出来的代码只能完成最基本的功能,一旦输入特殊的边界条件参数就会错误百出甚至程序崩溃。
举个很多应聘者都被问过的一个问题:写一个函数,把字符串转化成整数。这道题看似很简单,绝大部分计算机专业的毕业生都能用十行以内的代码实现最基本的功能。可是在实际面试过程中,十个应聘者中只有一个人能通过这道题的面试,因为绝大部分应聘者不能全面考虑到各种特殊输入,比如输入的字符串含中有非数字的符号、在字符串的开头有正负号、字符串中有正负号但其位置不是在字符串的开头。
除此之外,面试官还希望应聘者能考虑的边界条件包括2147483647(0x7FFFFFFF,int能表示的最大正整数)和-2147483648(0×80000000,int能表示的最小负整数)。
除了边界条件和特殊输入考虑不足之外,面试官还有一个不能容忍的错误就是程序崩溃。面试时很多应聘者都会忘记对空指针做特殊处理而导致程序崩溃。如果面试时遇到链表、二叉树相关的题目,应聘者一定要特别小心。因为这两种题目对应的代码里通常会有大量的指针操作,如果考虑不周到,就有可能对空指针进行操作而使程序崩溃。
比如这样一道题:输入一个链表的头指针和一个无符号整数k,输出该链表的倒数第k个结点。这个题目很多人都能想到用两个指针来解决:第一个指针先在链表上移动k-1步,同时让第一个指针和第二个指针在链表上移动。当第一个指针移动到尾指针时,第二个指针指向的就是倒数第k个结点。然而不是每个应聘者都能根据正确思路写出完整的代码。不少应聘者会忽略两种可能:一是输入的链表头指针有可能是空指针;二是链表上结点的数目有可能少于k个。忽略这两点的代码都存在崩溃的可能,从而很难获得面试官的青睐。
要想写出鲁棒的高质量代码,需要在动手写代码之前想好测试用例。在写代码之前,先要想好各种边界条件和特殊输入作为测试用例。当代码写好之后,自己在心里用之前想好的测试用例来检验自己写出的代码,这样就能在面试官之前发现并解决问题。以求链表的倒数第k个结点为例,如果事先想到了输入头指针为空指针和链表上的结点总数少于k这两个测试用例,并且在写好代码之后在心里模拟代码的运行过程,确保能够通过这两个测试用例的测试,那么这轮面试必然是能够通过的。
清晰的思路
只有思路清晰,应聘者才有可能在面试过程中解决复杂的问题。有时面试官会有意出一些比较复杂的问题,以考查能否在短时间内形成清晰的思路并解决问题。对于确实很复杂的问题,面试官甚至不期待应聘者能在面试不到一个小时的时间里给出完整的答案,他更看重的可能还是应聘者是否有清晰的思路。面试官通常不会喜欢应聘者在没有形成清晰思路之前就草率地开始写代码,结果写出来的代码容易逻辑混乱、错误百出。
应聘者可以用几个简单的方法帮助自己形成清晰的思路。
首先是举几个简单的具体例子让自己理解问题。当一眼看不出问题中隐藏的规律时,可以试着用1~2个具体的例子模拟操作的过程,这样说不定就能通过具体的例子找到抽象的规律。
其次可以试着用图形表示抽象的数据结构。像分析与链表、二叉树相关的题目时,可以画出它们的结构图来简化题目。
最后可以试着把复杂的问题分解成若干个简单的子问题,再一一解决。很多基于递归的思路,包括分治法和动态规划法,都是把复杂的问题分解成一个或者多个简单的子问题。
比如把二叉搜索树转化排序的双向链表这个问题就很复杂。碰到这个问题,不妨先画出1~2个具体的二叉搜索树及其对应的排序双向链表,直观地感受二叉搜索树和排序的双向链表有哪些联系。如果一下子找不出转换的规律,可以把整个二叉树看出三部分:根结点、左子树和右子树。当递归地把转换左右子树这两个子问题解决之后,再把转换左右子树得到的链表和根结点链接起来,整个问题也就解决了。
优化代码的能力
优秀的程序员对时间和空间的消耗锱铢必较,他们很有激情不断优化自己的代码。当面试官出的题目有多种解法时,通常他会期待应聘者最终能够找到最优解。这就要求应聘者在面试官提示还有更好的解法时,不能放弃思考,而应该努力寻找在时间消耗或者空间消耗上可以优化的地方。
要想优化时间或者空间效率,首先要知道如何分析效率。即使是同一个算法,用不同方法实现的效率可能也会大不相同,要能够分析出算法及其代码实现的效率。例如求斐波那契数列,很多人喜欢用递归公式f(n)=f(n-1)+f(n-2)求解。如果分析它的递归调用树,就会发现有大量的计算是重复的,时间效率是以n的指数增加。但如果先求f(1)、f(2),再根据f(1)和f(2)求出f(3),接下来根据f(2)、f(3)求出f(4),并以此类推用一个循环求出f(n),这种计算方法的时间效率就只有O(n),比前面递归的方法要好很多。
要想优化代码的效率,还要熟知各种数据结构的优缺点,并能选择合适的数据结构解决问题。我们在数组中根据下标可以用O(1)完成查找。数组的这个特征可以用来实现简单的哈希表解决很多面试题,比如在字符串中找到第一个只出现一次的字符。再比如为了找出n个数字中最小的k个数,需要一个数据容器来存储k个数字。在这个数据容器中,我们希望能够快速地找到最大值并且能快速地替换其中的数字。经过权衡,我们发现二叉树比如最大堆或者红黑树都是实现这个数据容器的理想选择。
要想优化代码的效率,也要熟练掌握常用的算法。面试中最常用的算法是查找和排序。如果从头到尾顺序扫描一个数组,需要O(n)时间才能完成查找操作。但如果数组是排序的,应用二分查找算法就能把时间复杂度降低到O(logn)。排序算法除了能够给数组排序之外,还能用来解决其他问题。比如快速排序算法中的Partition函数能够用来在n个数里查找第k大的数字,从而可以用O(n)的时间在数组中找到出现次数超过数组长度一半的数字。如果面试题是一个求最大值或者最小值的题目,则可以尝试用动态规划法或者贪婪算法,比如用动态规划法求出数组中连续子数组的最大和。
优秀的综合能力
在面试过程中,应聘者除了展示自己的编程能力和技术功底之外,还需要展示自己的软技能,诸如沟通能力和学习能力。随着软件系统的规模越来越大,软件开发已经告别了单打独斗的年代,程序员与他人的沟通变得越来越重要。在面试过程中,面试官会观察应聘者在介绍项目经验或者算法思路时是否观点明确、逻辑清晰,并以此判断他沟通能力的强弱。另外,面试官也会从应聘者说话的神态和语气来判断他是否有团队合作的意识。通常面试官不会喜欢高傲或者轻视合作者的人。
IT行业知识更新很快,因此程序员只有具备很好的学习能力才能跟上知识更替的步伐。通常面试官有两种办法考查应聘者的学习能力。第一种方法是询问应聘者最近在看什么书、从中学到了哪些新技术。面试官可以用这个问题了解应聘者的学习愿望和学习能力。第二种方法是抛出一个新概念,接下来他会观察应聘者能不能在较短时间内理解这个新概念并解决相关的问题。比如面试官要求应聘者计算第1500个丑数。很多人都没有听说过丑数这个概念。这时面试官就会观察应聘者面对丑数这个新概念,能不能经过提问、思考、再提问的过程,最终找出丑数的规律从而找到解决方案。
知识迁移能力是一种特殊的学习能力。如果我们能够把已经掌握的知识迁移到其他领域,那么学习新技术或者解决新问题就会变得容易。面试官经常会先问一个简单的问题,再问一个很复杂但和前面的简单问题相关的问题。这时面试官期待应聘者能够从简单问题中得到启示,从而找到解决复杂问题的窍门。比如面试官先要求应聘者写一个函数求斐波那契数列,再问一个青蛙跳台阶的问题:一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶,请问这只青蛙跳上n级的台阶总共有多少种跳法?应聘者如果具有较强的知识迁移能力,就能分析出青蛙跳台阶问题实质上只是斐波那契数列的一个应用。
还有不少面试官喜欢考查应聘者的抽象建模能力和发散思维能力。面试官从日常生活中提炼出问题,比如如何判断5张扑克牌是不是顺子,考查应聘者能不能把问题抽象出来用合理的数据结构表示,并找到其中的规律解决这个问题。面试官也可以限制应聘者不得使用常规方法,这要求应聘者具备创新精神,能够打开思路从多角度去分析、解决问题。比如面试官要求应聘者不用加减乘除四则运算实现两个整数的加法。此时面试官期待应聘者能够打开思路,用位运算实现整数的加法。
IT公司AS3面试题
1.谈谈你对MVC的理解??
答:MVC就是 模型、视图 、控制器 的缩写,视图和用户交互 通过事件导致控制器改变 控制器改变导致模型改变 或者控制器同时改变两者 模型改变导致视图改变 或者视图改变 潜在的从模型里面获得参数 来改变自己。
Mvc就是一种模型 ,一种编程思想。
MVC(Model-View-Controller),即把一个应用的输入、处理、输出流程按照Model、View、Controller的方式进行分离,这样一个应用被分成三个层——模型层、视图层、控制层。
视图(View):代表用户交互界面,MVC设计模式对于视图的处理是限于视图上数据的采集和处理,以及用户的请求,而不包括在视图上的业务流程的处理。
模型(Model):业务流程/状态的处理以及业务规则的制定。业务流程的处理过程对其它层来说是黑箱操作,模型接受视图请求的数据,并返回最终的处理结果。业务模型的设计可以说是MVC的核心。
控制(Controller):可以理解为从用户接收请求, 将模型与视图匹配在一起,共同完成用户的请求,但是它却不做任何的数据处理。
它的优势在与:开发人员可以只关注整个结构中的其中某一层,可以很容易的用新的实现来替换原有层次的实现,可以降低层与层之间的依赖,有利于标准化,利于各层逻辑的复用
2. as3怎样连接数据库??
答:as3 要和数据库通信 一般通过第三方语言 比如 jsp/ php /asp/ asp.net 等
As3通过解析xml里面的数据和数据库通信。
切换。
3.了解as3与PHP通信么?
答:通过apache软件(软件介绍:最流行的HTTP服务器软件之一。快速、可靠、可通过简单的API扩展,Perl/Python解释器可被编译到服务器中,完全免费,完全源代码开放。如果你需要创建一个每天有数百万人访问的Web服务器)
首先需要两个文件 我随便起一个名字test.php 和 test.fla
把他们放在apache运行目录下面
As代码里面主要用到urlloader、urlrequest、urlvariable等类,用urlrequest.data 属性和Urlrequest.method等属性来和php传参数。
Php里面发送什么,as就可以接收到什么,这样可以实现as3和php的通信。
4. 怎么获取居中的位置??
答:mc.x=stage.StageWidth/2
mc.y=stage.StageHeight/2
5. 多场景如果互相切换(考虑效率);
答:通过nextscene()函数
或者用Loader 加载另外的swf文件来场景
6:谈谈对A*寻路算法的理解
答: 一个估价值函数 f(n)=g(n)+h(n)
g(n)就是当时目标的位置到指定点的位置的一个值
h(n)就是指定点的位置到目标点的位置的的一个值
7: as2与as3.的最主要区别是什么?,以及相互的优缺点
答:as2和as3最大的区别在于 as2是面向过程的 as3是纯面向对象的。As3增加了很多新的东西 比如正则表达式 ,垃圾回收机制,增加了很多error类。
里面的函数架构变了很多 顶级函数缩减了很多 as3的架构更合理
8: 谈谈你对面向对象的理解
答:面向对象关键是对象,引用一句话“一切事物结对象”;对象有它固有的属性和方法,
对象也就是由属性的集合和方法的集合构成的, 谈到对象了,对象是类的一个实例。
类和对象是面向对象的基础 类是对象的一个抽象,不是具体的实例, 比如说狗类
分为很多种,而狗就是一个抽象, 狗有四条腿,两只眼睛 等式他的属性, 狗会吃东西,叫,等式他的方法。这是我理解的面向对象。
9.你的5(或3)年前景规划和在5(或3)年后在flash行业要达到的目标(及个人职业规划)?建议:
1.尽量选择有自主产品的公司,而非单纯的外包公司。(有自己的产品,代表你可以对你自己的产品进行持续维护和改良,对你自身的编程能力是一种持续性的提高)
2.尽量选择待成长型的公司,而并非公司越大越好。(成长型的公司往往产品更有创意,开发成本更小,效率更高,有利于你在短时间内积累更多的作品)
3.尽量远离广告制作公司。
10什么是OOP? OOP有那些特征简要说明?
OOP: Object OrientedProgramming,面向对象的程序设计
特征:抽象,多态,封装,继承
12.请说下你理解AS3的事件机制是什么机制?你认为正确的就可以说出来.
答:从应用程序到最外层的容器在到容器里的组件或容器遍历注册的事件,然后按照原路返回冒泡响应事件
AS3事件流分三个阶段:
1.捕获阶段 (即由根节点流向子节点,检测每个节点是否注册了监听器)
2.目标阶段 (激发在目标对象本身注册的监听程序)
3.冒泡阶段 (从目标节点到根节点,检测每个节点是否注册了监听器)
当中涉及了两个属性target和currentTarget,target是事件的派发者,currentTarget是正在检测的对象,当开始了事件流,事件的currentTarget属性处于不断变化中.
PS:注册事件时捕获阶段默认是关闭的,无论事件是否开启了捕获,事件流只会两选一去执行
13.说说就你所知道的用flash做网站建设的优缺点
优点:全面的控制、无缝的导向跳转、更丰富的媒体内容、更体贴用户的流畅交互、跨平台和瘦客户端的支持、以及与其它Flash应用方案无缝连接集成等
限制:受带宽与下载时间的限,下载速度有时候很慢;受搜索引擎的限制,现在大部分的搜索引擎搜多不到Flash站点信息,但是google搜索引擎已经解决了这个问题。
15.as3.0垃圾回收器是如何工作的?
flash player 8之前采用的是引用计数法,在flash player 8 之后用的是标记法,简单的说就是:从应用的根节点开始,遍历所有其上的引用,标记每个它所发现的对象。然后迭代遍历每个被标记的对象,标记它们的子对象。这个过程第归进行,直到Player遍历了应用的整个对象树并标记了它所发现的每个东西。在这个过程技术的时候,可以安全地认为,内存中那些没有被打标记的对象没有任何活动引用,因此可以被安全地释放内存。一般来说,flash player采用的是一种低频的垃圾回收机制,Flash Player的垃圾回收发生在FlashPlayer需要另外请求内存之前。但并不是每次应用申请内存时都会导致垃圾回收的执行,只有当Flash占用的内存紧张到一定程度时才会执行真正的垃圾回收,一定程度上取决于客户端计算机的物理内存的大小。
16.什么是游戏引擎和对他的认识?
答:是指应用通常游戏设计的模型构建一个“平台“,能够
方便的支持游戏开发后续的工作 引擎就是“用于控制所有游戏功能的主程序,从计算碰撞、物理系统和物体的相对位置,到接受玩家的输入,以及按照正确的音量输出声音等等
17. flash与flex是如何协调开发的?
这个问题可以这样来理解,如果是确实需要用到FLEX SDK的应用,那我们就可以建立一个flex工程,具体需要flash做UI的时候,输出成swc作为flex的skin,如果说并不需要flex sdk,只是为了编码方便而选择flex的话,那我们只要建立一个as工程,让flex作为flash的编码器。
18.使用Flex Bulider3建立一下新的.mxml的页面时默认的背景是蓝色的,请问用什么办法能修改掉此背景颜色,以至于下次创建时背景不是为默认的蓝色的呢?请写出你认为正确的方法.
答:修改sdk\frameworks\projects\framework\default.css里Application的backgroundColor: #0000FF;
19.flex的开发框架有哪些,它们有什么优缺点?
答: 最常见的当然是Cairngorm、Puremvc了,此外还有Mate,Swiz等等,据说被广泛应用的已经有10几款了。Cairngorm作为Adobe官方出品,有着贵族血统的它比较全面,是这些框架中已知bug最少的,但是基于他的应用相对臃肿复杂一些,需要对每个可以被触发的事件写一个对应的Command,编码量巨大,并且单元测试很不容易,不适合敏捷开发。Puremvc应该是现在用的最多的as框架了。比较完善、并且与Cairngorm相比,更适合中小型应用的开发,它与Cairngorm一样,也是以MVC模式为中心,并以Fa?0?4ade作为中央存储器的单件类的形式进行开发的。说下Mate,它是一个比较奇怪的框架,是基于标签的事件驱动型的。也就是说你不能再随意的写as类的,在使用Mate的情况下,只能用MXML来做这些事情。Swiz是Mate的孪生兄弟,长的挺像,没具体用过,不大了解。
11.使用Flex Bulider3如何跟踪程序?
答:我知道的三种1.trace() 2.设置断点 3.当不在调试模式时可以调用as的Alert.show()或js的alert() 如:navigateToURL(new URLRequest(“javascript:alert(traceMsg)”),”_self”);
20.在flex开发中,很多代码都写在mxml文件里,为了做到mvc模式,你是怎么处理的。
我认为mxml并不影响mvc模式啊。分两种情况来讨论,首先,是自己创建整个应用结构的时候,那我们可以手动将UI所在的mxml归为一类,然后由Mediator去操作或者说控制这些组件既可了,然后Mediator又统一交给Controller去操作。如果采用其他框架来进行开发的话,那就更不用来考虑这个问题了,像Cairngorm、Puremvc之类的框架已经很好的为我们解决了这些问题。只要按照它们的使用规范来进行开发,自然没有问题。
访问控制代码:
class Foo
{
private $name = hdj;
public function getName(){
return $this->name;
}
}
class Bar extends Foo
{
public $name = deeka;
}
$bar = new Bar;
var_dump($bar->name);
var_dump($bar->getName());
Mina728回复7 楼 20_-02-09小算法总结:
//打印一个三角形
for($i=0;$i<=3;$i++)
{
for($j=0;$j<=3-$i;$j++){
echo ‘ ’;
}
for($k=0;$k<=2*$i;$k++)
{
echo “*”;
}
echo ‘
’;
}
?>
//杨辉三角
for($i=0;$i<6;$i++)
{
//第一个和最后一个都为1
$a[$i][0]=1;
$a[$i][$i]=1;
}
for($i=2;$i<6;$i++){
for($j=1;$j<$i;$j++)
{
$a[$i][$j]=$a[$i-1][$i-1]+$a[$i-1][$j];
}
}
for($i=0;$i<6;$i++)
{
for($j=0;$j<=$i;$j++){
echo $a[$i][$j].’ ’;
}
echo ‘
’;
}
?>
//合并多个数组
function t(){
$c=func_num_args()-1;//返回传递给函数的参数个数
$a=func_get_args();//返回一个数组,包括函数的参数列表
for($i=0;$i<=$c;$i++){
if(is_array($a[$i])){
for($j=0;$j
$r[]=$a[$i][$j];
}
}else{
die(‘Not a array’);
}
}
return $r;
}
print_r(t(range(1,4),range(1,4),range(1,4)));
?>
//求牛
function cow($num,$y)
{
for($j=1;$j<$y;$j++)
{
if($j>=4 && $j<15)
{
$num++;
cow($num,$y-$j);
}
if($j==20)
$num–;
}
return $num;
}
echo cow(2,2);
?>
//顺序查找(数组里查找某个元素)
function seq_sch($array,$n,$k)//在某个位置之前查找某元素(不包括指定位置)
{
$array[$n]=$k;
for($i=0;$i<$n;$i++)
{
if($array[$i]==$k)
break;
}
if($i<$n)
return $i;
else
return -1;
}
$array=array(‘a’,b’,c’);
echo seq_sch($array,2,’b);
?>
function show($i)
{
if($i==1)
return 1;
else
return $i*show($i-1);
}
echo “
”;
echo show(3);
?>
//裴波那挈数列
function b($n)
{
if($n<2)
return $n;
else
return b($n-1)+show($n-2);
}
echo b(2);
?>