最近遇到的一些面试题

以下是我最近面试遇到的一些面试题目,是我做完后用手机拍下回来整理出来的。绝大部分题目都是直接在网上可以很容易找到原题。

1、写一个排序算法,可以是冒泡排序或者是快速排序,假设排序对象是一个一维数组。

//冒泡排序(数组排序)
function bubble_sort($array) {
  $count = count($array);
  if ($count <= 0) return false;
  for($i=0; $i<$count; $i++){
         for($j=$count-1; $j>$i; $j--){
           if ($array[$j] < $array[$j-1]){
              $tmp = $array[$j];
              $array[$j] = $array[$j-1];
              $array[$j-1] = $tmp;
           }
         }
  }
  return $array;
}

//快速排序(数组排序)
function quicksort($array) {
  if (count($array) <= 1) return $array;
  $key = $array[0];
  $left_arr = array();
  $right_arr = array();
  for ($i=1; $i<count($array); $i++){
         if ($array[$i] <= $key)  $left_arr[] = $array[$i];
         else $right_arr[] = $array[$i];
  }
  $left_arr = quicksort($left_arr);
  $right_arr = quicksort($right_arr);
  return array_merge($left_arr, array($key), $right_arr);
}

2、实现一个字符串截取的函数,类似于substr,必须能够截取中文这种多字节字符串(假设每个中文也是一个字符,普通的数字、字号、字母也是一个字符,GB2312中文字符高位范围是0x81-0xFE)。

/**
* 中文字符串截取(3)(支持GB2312/GBK/UTF-8/BIG5)
* @param string $str 要截取的字串
* @param int $start 截取起始位置
* @param int $length 截取长度
* @param string $charset 字符串的字符集,包括有 utf-8|gb2312|gbk|big5 编码
* @param bool $suffix 是否加尾缀
* @return string 返回接续字符串的结果
*/
function CSubstr($str, $start=0, $length, $charset="gbk", $suffix=false){
  if(function_exists("mb_substr")){
    return mb_substr($str, $start, $length, $charset);
  }
  $re['utf-8'] = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/";
  $re['gb2312'] = "/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/";
  $re['gbk'] = "/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/";
  $re['big5'] = "/[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/";
  preg_match_all($re[$charset], $str, $match);
  $slice = join("", array_slice($match[0], $start, $length));
  if($suffix) {
    return $slice ."…";
  }
  return $slice;
}

3、写一个遍历指定目录下所有子目录和子文件的函数(提示:可以使用递归的方法)。

/**
* 递归的遍历一个指定目录
*/
function dir_all ( $path ) {
  $handler = opendir($path);
  while (false !== ($tmp = readdir($handler))) {
    if(is_dir( "$path/$tmp" )) {
      if ($tmp=="." | $tmp=="..") continue;
      echo $tmp."<br>\n";
      dir_all ("$path/$tmp");
    } else {
      echo $tmp ."<br>\n";
    }
  }
}

4、写出匹配邮箱地址和URL的两个正则表达式,类似下面的:

邮箱地址: user_name.first@example.com.cn
URL地址:http://www.example.com.cn/user_profile.php?uid=100
(提示:使用标准的正则表达式,就是php中preg_*类的正则处理函数能够解析的正则)

邮箱:/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/
URL:/^http:\/\/[\w]+\.[\w]+[\S]*/

5、写出三种以上MySQL数据库的存储引擎的名称。不名分大小写

MyISAM、InnoDB、MERGE、MEMORY(HEAP)、BDB(BerkeleyDB)、EXAMPLE、FEDERATED、ARCHIVE、CSV、BLACKHOLE。
MyISAM管理非事务表。它提供高速存储和检索,以及全文搜索能力。
MEMORY存储引擎提供“内存中”表。
InnoDB和BDB存储引擎提供事务安全表。
NDB Cluster是被MySQL Cluster用来实现分割到多台计算机上的表的存储引擎。

6、说出你所知道的三种以上开源数据库的名称。

MYSQL  PostgreSQL  Firebird  Berkeley  DBSQLite  PostgreSQL

7、MySQL数据库中的字符类型varchar和char的主要区别是什么?哪种字符查询效率要高?为什么?

varchar是可变长度,而char为固定长度。
char效率要高。

8、MySQL数据库基本的三个优化法则是什么?(提示:从服务配置、应用、开发三个角度考虑)。

系统服务优化,把mysql的key_buffer、cache_buffer、query_buffer等增加容量
给所有经常查询的字段适当增加相应的索引
优化sql语句,减少Distinct,Group,Join等语句的操作

9、请使用JavaScript写出三种产生一个Image标签的方法。(提示:从方法、对象、HTML角度考虑)

var img = new Image();
var img = document.createElementById('image');
img.innerHTML = '<img src=xxx.jpg />';

10、请使用CSS样式,描述两种方法在当前列中只显示一个div对象。

<div style='width:199999px;'></div>
<div style='clear:both;'></div>

11、请描述两点以上XHTML和HTML最显著的区别。

(1)XHTML必须强制指定文档类型DocType,HTML不需要
(2)XHTML所有标签必须闭合,HTML比较随意

12、说出五种以上你使用过的php扩展的名称。

MB_String  Curl  GD  socket Mysql PDO mongo gearman oauth apc

13、写出三种以上目前php流行的MVC框架名称。

CodeIgniter  FleaPHP、Zend Framework、CakePHP、Symfony、Plite、php.MVC、PHP on Trax、Smarty 等等

14、写出十五个以上你所知道的常用Linux命令和它的功能。

15、说说Linux下的find命令和grep命令的区别。

16、请简单的描述Memcache缓存的工作原理。

17、请大致的描述一下Session的工作原理。(提示:与cookie有相应的关系)

18、你用什么方法检查php脚本的执行效率(通常是脚本执行时间)和mysql查询效率(通常是数据 库Query时间),并定位和分析脚本执行和数据库查询的瓶颈。

19、假设给你五台服务器,请大致的描述一下,如何使用你所熟悉的开源软件,搭建日PV 300万左右的中型网站。

=========================================================

1、你使用过的php插件、框架?

2、如何解决jquery ajax的跨域问题?

jsonp

3、mysql_fetch_row()和mysql_fetch_array()之间有什么区别?

这两个函数,返回的都是一个数组,区别就是第一个函数返回的数组是只包含值,我们只能$row[0],$row[1],这样以数组下标来读取数据,
而MySQL_fetch_array()返回的数组既包含第一种,也包含键值对的形式,我们可以这样读取数据:
$row['username'], $row['passwd']

4、如何使用php获取一个url的html内容?

用curl扩展,或 file_get_contents($url)

5、$uptime = ‘2013-01-06 08:12:33’,写出php计算$uptime三天后方法?

$newt = strtotime('+3 days', strtotime('2013-01-06 08:12:33'));
echo date('Y-m-d H:i:s', $newt);

6、php如何将数组 array(‘b’, ‘a’, ‘c’)转变成array([1]=>’a’,[0]=>’b’,[2]=>’c’)?

7、preg_match(“/^(http:\/\/)?([^\/]+)/i”, “http://www.php.net/index.html”, $matches); echo $matches[0];

http://www.php.net

8、执行将输出?

2

9、linux的远程拷贝命令?

scp

10、linux修改文件filename及其子目录的拥有者为username

chown filename username

11、linux中批量杀死mysql为sleep的连接

echo "`date` killing mysql sleep process..." >> /tmp/crontab.log
for id in `mysql -u root -pYourPassword, -e "show processlist"|grep -i -E 'sleep|locked'  | awk '{if($6>100){print $1}}'`
do
  echo "killing pid $id" >> /tmp/crontab.log
  echo `mysql -u root -pYourPassword, -e "kill $id"`
done

12、mysql中有哪些存储引擎

13、mysql修改表test主键为id?

添加唯一键
ALTER TABLE `test2` ADD UNIQUE ( `userid`)
修改主键
ALTER TABLE `test2` DROP PRIMARY KEY ,ADD PRIMARY KEY ( `id` )
增加索引
ALTER TABLE `test2` ADD INDEX ( `id` )

14、mysql计算日期’2013-01-14 20:34:47’向前推三天是哪一天?

select date_sub('2013-01-14 20:34:47', interval 3 day);

15、$str1 = null; $str2 = false; echo $str1 == $str2 ? ‘相等’ : ‘不相等’;

  相等

16、下面程序的输出结果

//A.php
<?php
function Test_Global(){
	include 'B.php';
	Test();
}

$a = 0;
Test_Global();
echo $a;

?>

//B.php文件
<?php
function Test(){
	global $a;
	$a -= 1;
}
?>

答案为-1

17、下面程序的输出结果

function getCount(){
	static $count = 3;
	return $count++;
}

function getCounts(&$count){
	unset($count);
	$count = 1;
}

$count = 5;
getCounts($count);
echo $count;
++$count;
echo $count;
echo getCount();
echo getCount();
5
6
3
4

18、使用php的二分法查找算法输出数组 $arr = array(1,2,3,4,5,6,7,8,9,12,23,33,35,56,67,89,99)中33的下标。

19、简述mysql的分区和分表。

么是分表,从表面意思上看呢,就是把一张表分成N多个小表
什么是分区,分区呢就是把一张表的数据分成N多个区块,这些区块可以在同一个磁盘上,也可以在不同的磁盘上

20、假设a.html和b.html在同一个文件夹下面,用javascript实现当打开a.html五秒钟后,自动跳转到b.html。

      window.onload = function (){
          setTimeout(function(){window.location.href = 'b.html'}, 5000)
      }

=========================================================

1、Python如何实现单例模式?

Python有两种方式可以实现单例模式,下面两个例子使用了不同的方式实现单例模式:

class Singleton(type):
    def __init__(cls, name, bases, dict):
        super(Singleton, cls).__init__(name, bases, dict)
        cls.instance = None

    def __call__(cls, *args, **kw):
        if cls.instance is None:
        cls.instance = super(Singleton, cls).__call__(*args, **kw)
        return cls.instance

class MyClass(object):
    __metaclass__ = Singleton

print MyClass()
print MyClass()

使用decorator来实现单例模式

def singleton(cls):
    instances = {}
    def getinstance():
        if cls not in instances:
        instances[cls] = cls()
        return instances[cls]
   return getinstance

@singleton
class MyClass:
…

2、什么是lambda函数?

Python允许你定义一种单行的小函数。定义lambda函数的形式如下:labmda 参数:表达式lambda函数默认返回表达式的值。
你也可以将其赋值给一个变量。lambda函数可以接受任意个参数,包括可选参数,但是表达式只有一个:

>>> g = lambda x, y: x*y
>>> g(3,4)
12

3、Python是如何进行类型转换的?

Python提供了将变量或值从一种类型转换成另一种类型的内置函数。int函数能够将符合数学格式数字型字符串转换成整数。否则,返回错误信息。

>>> int(“34″)
34
>>> int(“1234ab”) #不能转换成整数
ValueError: invalid literal for int(): 1234ab

4、Python如何定义一个函数?

函数的定义形式如
下:
def (arg1, arg2,… argN):
  ....
  return ...

5、Python是如何进行内存管理的?

Python提供了对内存的垃圾收集机制,但是它将不用的内存放到内存池而不是返回给操作系统。

6、如何反序的迭代一个序列?

a = [1, 2, 3, 4, 5]
for x in a[::-1]:
	print x,

7、Python里面如何实现tuple和list的转换?

使用tuple()和list()就直接可以转换了

>>>tuple([1,2])
(1, 2)
>>> list((1,2))
[1, 2]

8、请写出一段python代码实现删除一个list里面的重复元素。

使用set

>>>a=[1, 2, 2, 3, 2, 1, 5, 4]
>>>list(set(a))
[1, 2, 3, 4, 5]

9、如何用python删除一个文件?

import os
删除文件:
os.remove()
删除空目录:
os.rmdir()
递归删除空目录:
os.removedirs()

10、python如何copy一个文件?

shutil.copyfile:如何复制文件
os.path.exists:如何判断文件夹是否存在
shutil.copytree:如何复制目录树

11、python里面如何生成随机数?

使用random库

>>>import random
>>>random.random()
0.65210770661102258
>>> random.randint(1, 100)
93

12、如何用python来发邮件?

主要使用smtplib库

smtp = smtplib.SMTP()
try  :
      smtp.set_debuglevel( 1 )
      smtp.connect(" server ")
      smtp.login(" user ", " password")
except :
      print " smtp login exception! "
smtp.sendmail(fromaddr, toaddrs, msg)
smtp.quit()

13、python里面如何拷贝一个对象?

标准库中的copy模块提供了两个方法来实现拷贝.一个方法是copy,它返回和参数包含内容一样的对象.

import copy
new_list = copy.copy(existing_list)

有些时候,你希望对象中的属性也被复制,可以使用deepcopy方法:

import copy
new_list_of_dicts = copy.deepcopy(existing_list_of_dicts)

14、有没有一个工具可以帮助查找python的bug和静态的代码分析?

有,PyChecker是一个python代码的静态分析工具,它可以帮助查找python代码的bug, 会对代码的复杂度和格式提出警告
Pylint是另外一个工具可以进行coding standard检查。

15、如何在一个function里面设置一个全局变量?

global 语句。在function的开始插入一个global声明:
def f():
    global x

16、有两个序列a,b,大小都为n,序列元素的值为任意整形数,无序。要求交换a、b中的元素,使[序列a元素的和]与[序列b元素的和]之间差最小。

* 将两序列合并为一个序列,并排序,为序列Source
* 拿出最大元素Big,次大的元素Small
* 在余下的序列S[:-2]进行平分,得到序列max,min
* 将Small加到max序列,将Big加大min序列,重新计算新序列和,和大的为max,小的为min。

17、用python匹配html tag的时候,和有什么区别?

贪婪与非贪婪

18、python里面search()和match()的区别?

match()函数只检测RE是不是在string的开始位置匹配, search()会扫描整个string查找匹配,
也就是说match()只有在0位置匹配成功的话才有返回,如果不是开始位置匹配成功的话,match()就返回none

例如:

print(re.match(‘super’, ‘superstition’).span())会返回(0, 5)
而 print(re.match(‘super’, ‘insuperable’))则返回None

search()会扫描整个字符串并返回第一个成功的匹配

例如:print(re.search(‘super’, ‘superstition’).span())返回(0, 5)

print(re.search(‘super’, ‘insuperable’).span())返回(2, 7)

19、如何用python来进行查询和替换一个文本字符串。

a = 'hello word'
我把a字符串里的word替换为python
1用字符串本身的replace方法
a.replace('word','python')
输出的结果是hello python

2用正则表达式来完成替换:
import re
strinfo = re.compile('word')
b = strinfo.sub('python',a)
print b
输出的结果也是hello python

20、介绍一个except的用法和作用。

Python的except用来捕获所有异常, 因为Python里面的每次错误都会抛出 一个异常,所以每个程序的错误都被当作一个运行时错误。

try:
    foo = opne(“file”) # 这时候except只捕获IOError
except IOError:
    sys.exit(“could not open file”)

21、python中pass语句的作用是什么。

什么都不做,空操作。

22、介绍一下python下range()函数的用法。

>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> range(1, 11)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> range(0, 30, 5)
[0, 5, 10, 15, 20, 25]
>>> range(0, 10, 3)
[0, 3, 6, 9]
>>> range(0, -10, -1)
[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
>>> range(0)
[]
>>> range(1, 0)
[]

=========================================================

1、运行下面程序,输出结果为?

<?php
	$global_obj = null;
	class my_class {
		var $value;
		function my_class(){
			global $global_obj;
			$global_obj = &$this;
		}

	}

	$a = new my_class();
	$a->my_value = 50;
	$global_obj->my_value = 100;
	echo $a->my_value;

?>

答案为50

2、运行下面程序,输出结果为?

<?php
	class my_class {
		var $value;
	}

	$a = new my_class();
	$a->my_value = 5;
	$b = $a;
	$b->my_value = 10;
	echo $a->my_value;

?>

答案为10

3、运行下面程序,输出结果为?

<?php
	define('myvalue', '10');
	$var = 'abs_system';
	$myarray[10] = 'Dog';
	$myarray[] = 'Human';
	$myarray['myvalue'] = 'Cat';
	$myarray['Dog'] = 'Cat';
	print 'The value is:';
	print $myarray[myvalue].$var{2}.'\n';

?>

答案为 The value is:Dogs\n