Skip to content

Latest commit

 

History

History
574 lines (382 loc) · 19.5 KB

笔试题.md

File metadata and controls

574 lines (382 loc) · 19.5 KB

收集的笔试题

1、给你四个坐标点,判断它们能不能组成一个矩形,如判断([0,0],[0,1],[1,1],[1,0])能组成一个矩形。

解题思路:

以一个点为参考点。分别计算出到任意三点的距离,最长的距离的一个一个点是对角线的点。

剩下的两个点是左右两个点。 用剩下的两个点计算出另外一个对角线的距离。如果两条对角线相等,

判断任意一个角是不是直角。即可判断是不是矩形了。

2、写一段代码判断单向链表中有没有形成环,如果形成环,请找出环的入口处,即P点

判断链表中是否有环 -- 有关单链表中环的问题

快慢指针

3、写一个函数,获取一篇文章内容中的全部图片,并下载

function catchData($url) {
    $string = file_get_contents($url);
    preg_match_all('/<\s*img[^src]*src\s*=\s*"([^"]*)"/',$string,$data);
    $imgs = $data[1];
    if(empty($imgs)) {
        return false;
    }
    foreach ($imgs as $key=>$value) {
        $path = explode("/",$value);
        echo $value;
        $img = file_get_contents($value);
        file_put_contents($path[count($path)-1],$img);
    }
}

4、获取当前客户端的IP地址,并判断是否在(111.111.111.111,222.222.222.222)

注意:(111.111.111.111,222.222.222.222) 这是一个集合区间,不是数组的array

利用php获取ip地址。 然后转成long

public function ip() {
    //strcasecmp 比较两个字符,不区分大小写。返回0,>0,<0。
    if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) {
        $ip = getenv('HTTP_CLIENT_IP');
    } elseif(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) {
        $ip = getenv('HTTP_X_FORWARDED_FOR');
    } elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) {
        $ip = getenv('REMOTE_ADDR');
    } elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) {
        $ip = $_SERVER['REMOTE_ADDR'];
    }
    $res =  preg_match ( '/[\d\.]{7,15}/', $ip, $matches ) ? $matches [0] : '';
    return $ip;
}
$ip = sprintf('%u',ip2long(ip());
$begin = sprintf('%u',ip2long('111.111.111.111'))
$end = sprintf('%u',ip2long('222.222.222.222'))
if($ip > $begin && $ip < $end) {
    echo "在这个区间里"。
}

5、nginx的log_format配置如下: log_format main ‘remoteaddr−remote_user [timelocal]"request”’ ‘statusbody_bytes_sent “httpreferer"″"http_user_agent” “upstreamresponsetime""request_time” “http_x_forwarded_for"'; 从今天的nginx log文件 access.log中:

a、列出“request_time”最大的20行?

cat access.log | awk '{arr[$4]++} END {for(i in arr) {print arr[i],$0}}' | sort -r | head -10

b、列出早上10点访问量做多的20个url地址?

cat access.log| awk '/2017:16/{arr[$1]++} END{ for(i in arr) {print ar
r[i],i}}'  | sort  -rn | head -20

6、csrf和xss的区别

   csrf 跨站请求攻击。验证码、token、检测refer
   xss 跨站脚本攻击,过滤用户输入。

7、应用中我们经常会遇到在user表随机调取10条数据来展示的情况,简述你如何实现该功能

function get_random_array($min,$max,$number)
{
  $data = [];
  for($i = 0;$i<$number;$i++;)
  {
    $d = mt_rand($min,$max);
    if(in_array($d,$data)) {
      $i--;
    }else{
      $data[] = $d;
    }
  }
  return $data;
}

$sql = 'select * from user where user_id in (' .join(",",get_random_array($min,$max,$number)). ')'

8、从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是连续的

9、两条相交的单向链表,如何求它们的第一个公共节点

思路:

1. 如果两个链表相交,则从相交点开始,后面的节点都相同,即最后一个节点肯定相同;

2. 从头到尾遍历两个链表,并记录链表长度,当二者的尾节点不同,则二者肯定不相交;

3. 尾节点相同,如果A长为LA,B为LB,如果LA>LB,则A前LA-LB个先跳过,

class Node {
  public $data = NULL;
  public $next;
}

function getNodeLength(Node $node) {
  if(empty($node)) return 0;
  $length  = 0;
  while($node != NULL ) {
    $lenght++;
  }
  return $length;
}
/**
 * 求两个单链表相交的第一个公共节点
 */
function getPoint(Node $a,Node $b) {
  $a_length =getNodeLength($a);
  $b_length = getNodeLenght($b);
  //交换两个链表
  if($a_lenght < $b_lenght) {
    $temp = $a;
    $a = $b;
    $b = $temp;
  }
  $step = abs($a_length - $b_length);
  //先让a走step
  for($i = 0; $i<$step;$i++) {
    $a = $a->next;
  }
  //同步走
  while($a && $a !== $b) {
    $a = $a->next;
    $b = $b->next;
  }
  return $a;
  
}

10、最长公共子序列问题LCS,如有[1,2,5,11,32,15,77]和[99,32,15,5,1,77]两个数组,找到它们共同都拥有的数,写出时间复杂度最优的代码,不能用array_intersect(这里有坑,需要去研究一下动态规划)。

11、linux的内存分配和多线程原理

Linux内存分配

Linux线程和进程关系

12、MYSQL中主键与唯一索引的区别

​ 主键唯一不能为空

​ 唯一索引可以为空

一个表可以有多个唯一索引,但是只能有一个主键

13、http和https区别

​ https是在http的基础上加ssl层。进行了数据加密。保证传输过程中,数据加密,默认端口是443

​ http在传输中数据是明文 ,默认端口80

14、http状态码及其含意

​ 2xx 表示成功 比如 200

​ 3xx 资源转移 301 永久转移 304 Not Modified

​ 4xx 资源没找到或禁止访问 404、403

​ 5xx 服务器错误

15、linux中怎么查看系统资源占用情况

​ top 、free、iostat、vmstat

16、SQL注入的原理是什么?如何防止SQL注入

​ 用户传入的数据没有过滤。不要相信用户的输入

17、isset(null) isset(false) empty(null) empty(false)输出

​ false,false,true,true

18、优化MYSQL的方法

​ 数据库字段冗余,增添索引、优化sql、分库分表

19、数据库中的事务是什么?

​ 是指一些操作要么同时执行成功,要么同时失败的一个过程,事务具有acid四个特性。

20、写一个函数,尽可能高效的从一个标准URL中取出文件的扩展名

$arr = parse_url('http://www.sina.com.cn/abc/de/fg.php?id=1');
$result = pathinfo($arr['path']);
var_dump($result['extension']);

21、参数为多个日期时间的数组,返回离当前时间最近的那个时间

解题思路:让第一个时间作为哨兵。计算第一个时间和当前时间的差 diff,然后从第二个值开始遍历。如果第二个值和当前时间的值大于diff。则继续,否则该时间离当前时间近。把min赋值给当前值。

function ($timeArray,$now) {
    $min = $timeArray[0];
    $diff =abs($min-$now);
    $length = count($timeArray);
    for($i=1;$i<$length;$i++) {
        $diff1 = $timeArray[$i] - $now;
        if($diff1 < $diff) {
            $diff = $diff1;
            $min = timeArray[$i];
        }
    }
    return $min;
}

22、echo、print、print_r的区别

echo 是一个语法结构,print是一个函数 有返回值1.print_r 是一个函数,用于打印复合类型变量。

23、http协议的header中有哪些key及含义

非常多,建议记住几个常见的。

HTTP Header

24、二叉树前中后遍历代码

25、PHP的数组和C语言的数组结构上有何区别?

​ php的数组是一个hashtable 内存地址不连续 C数组是一个数组。内存地址连续

26、Redis的跳跃表怎么实现的

27、哈希是什么?hash冲突后,数据怎么存?

​ hash一种key=》value的结构。hash冲突之后,拉链、开放定址、再哈希方法

28、聚簇索引,聚集索引的区别?

聚簇索引:数据行的物理顺序与列值(一般是主键的那一列)的逻辑顺序相同,一个表中只能拥有一个聚集索引。

29、B+Tree是怎么进行搜索的

30、数组和hash的区别是什么?

​hash基于数组。数组在内存空间上是连续的地址。hash则不连续。

31、写个函数,判断下面扩号是否闭合,左右对称即为闭合: ((())),)(()),(()))),(((((()),(()()),()()

/**
    对于对称的结构第i个跟第n-i个相反。
*/
function close($string)
{
    if(empty($string)) {
        return false;
    }
    $length = strlen($string);
      //判断奇偶数
    if($length%2 ==1) {
        return false;
    }

    for ($i=0;$i<$length;$i++) {
        if($string[$i] == '('){
            if($string[$length-$i-1] != ')'){
                return false;
            }
        }else{
            if($string[$length-$i-1] != '('){
                return false;
            }
        }
    }
    return true;
}

var_dump(close( '(()())'));

32、 找出数组中不重复的值[1,2,3,3,2,1,5]

/**
 * 从数组中找出不重复的数字
 * @param $array
 */
function find($array)
{
    if(empty($array) || !is_array($array)) {
        return [];
    }

    $data = [];

    foreach ($array as $key=>$value) {

        if(isset($data[$value])) {
            $data[$value]++;
        }else{
            $data[$value] = 1;
        }
    }
    $result = [];
    foreach ($data as $k=>$v) {
        if($v != 1) {
            unset($data[$k]);
        }else{
            $result[] = $k;
        }

    }
    return $result;
}
var_dump(find([1,2,3,3,2,1,5]));

33、32题你的时间复杂度是多少?有的情况下,你写了个算法,然后面试官会让你把你的算法的时间复杂度表达式写出来

O(n)

34、PHP的的这种弱类型变量是怎么实现的?

通过zval结构。 zval 包含变量的信息。

zval{
    type
    value
}

type 记录变量的类型。然后根据不同的类型,找到不同的value。

35、在HTTP通讯过程中,是客户端还是服务端主动断开连接?

36、PHP中发起http请求有哪几种方式?它们有何区别?

​ curl、fscocket、socket

37、有一颗二叉树,写代码找出来从根节点到flag节点的最短路径并打印出来,flag节点有多个。比如下图这个树中的6和14是flag节点,请写代码打印8、3、6 和 8、10、14两个路径 img

38、有两个文件文件,大小都超过了1G,一行一条数据,每行数据不超过500字节,两文件中有一部分内容是完全相同的,请写代码找到相同的行,并写到新文件中。PHP最大允许内内为255M。

39、请写出自少两个支持回调处理的PHP函数,并自己实现一个支持回调的PHP函数

preg_matacth_callback. call_user_func

40、请写出自少两个获取指定文件夹下所有文件的方法(代码或思路)。

41、请写出自少三种截取文件名后缀的方法或函数(PHP原生函数和自己实现函数均可)

basename expload() strpos

42、PHP如何实现不用自带的cookie函数为客户端下发cookie。对于分布式系统,如何来保存session值。

保持到redis中。

43、请用SHELL统计5分钟内,nginx日志里访问最多的URL地址,对应的IP是哪些?

44、写一段shell脚本实现备份mysql指定库(如test)到指定文件夹并打包,并删除30天前的备份,然后将新的备份推送到远端服务器,完成后送邮件通知。

45、mysql数据库中innodb和myisam引擎的区别

46、从用户在浏览器中输入网址并回车,到看到完整的见面,中间都经历了哪些过程。

47、如何分析一条sql语句的性能。

explain SQL

48、ping一个服务器ping不通,用哪个命令跟踪路由包?

linux:traceroute,windows:tracert 49、$a=[0,1,2,3]; $b=[1,2,3,4,5]; $a+=$b; var_dump($a)等于多少?

50、$a=[1,2,3]; foreach($a as &$v){} foreach($a as $v){} var_dump($a)等于多少; (我加的)

51、数据库中的存放了用户ID,扣费很多行,redis中存放的是用户的钱包,现在要写一个脚本,将数据库中的扣费记录同步到redis中,每5分钟执行一次。请问要考虑哪些问题?

52、MYSQL主从服务器,如果主服务器是innodb引擎,从服务器是myisam引擎,在实际应用中,会遇到什么问题?

53、linux中进程信号有哪些?

54、redis的底层实现

55、异步模型

56、10g文件,用php查看它的行数

57、有10亿条订单数据,属于1000个司机的,请取出订单量前20的司机

58、设计一个微信红包的功能

59、根据access.log文件统计最近5秒的qps,并以如下格式显示,01 1000(难点在01序号)

60、php7性能为什么提升这么高

61、遍历一个多维数组

62、有这样一个字符串abcdefgkbcdefab......随机长度,写一个函数来求bcde在这个字符串中出现的次数

63、有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16个字节,内存限制大小是1M。返回频数最高的100个词

64、十道海量数据处理面试题与十个方法大总结(我加的)

https://blog.csdn.net/v_JULY_v/article/details/6279498 65、php进程模型,php怎么支持多个并发

66、nginx的进程模型,怎么支持多个并发

67、php-fpm各配置含义,fpm的daemonize模式

static - 子进程的数量是固定的(pm.max_children)
ondemand - 进程在有需求时才产生(当请求时,与 dynamic 相反,pm.start_servers 在服务启动时即启动
dynamic - 子进程的数量在下面配置的基础上动态设置:pm.max_children,pm.start_servers,pm.min_spare_servers,pm.max_spare_servers

68、让你实现一个简单的架构,并保持高可用,两个接口,一个上传一条文本,一个获取上传的内容,你怎么来设计?要避免单机房故障,同时要让代码层面无感。

69、两台mysql服务器,其中一台挂了,怎么让业务端无感切换,并保证正常情况下讲台服务器的数据是一致的

70、http协议具体的定义

71、什么是锁,怎么解决锁的问题

72、rand与mt_rand的区别

73、mysql事务隔离是怎么实现的

74、mysql的锁怎么实现的

75、对称加密和非对称加密的方式

76、10瓶水,其中一瓶有毒,小白鼠喝完有毒的水之后,会在24小时后死亡,问:最少用几只小白鼠可以在24小时后找到具体是哪一瓶水有毒。

77、redis是如何进行同步的,同步的方式,同步回滚怎么办,数据异常怎么办,同时会问MYSQL的同步方式和相关异常情况

78、怎么解决跨域

79、json和xml区别,各有什么优缺点

80、Trait优先级

81、a引用b,报错c里面类重复定义,循环引用会出现什么问题

82、下面员工3的薪水大于其主管的薪水,一条SQL找到薪水比下属低的主管

id username salary pid 1 a 3000 null 2 b 8000 null 3 c 5000 1 4 d 6000 3 82、在一个坐标系内有一个N个点组成的多边形,现在有一个坐标点,写代码或思路来判断这个点是否处于多边形内

83、数据库如果出现了死锁,你怎么排查,怎么判断出现了死锁?

84、写一个一个程序来查找最长子串

85、分析一个问题:php-fpm的日志正常,但客户端却超时了,你认为可能是哪里出了问题,怎么排查?

86、nginx的工作流程是什么样的,可以画图描述

87、进程间通信方式有哪些

88、主从复制,从服务器会读取到主服务器正在回滚的数据吗?主数据库写成功,从服务器因为一些原因写失败,最后会出现什么情况?主从复制如果键冲突怎么办?

89、事务有几种隔离级别?事务的隔离级别是怎么实现的?

90、什么是B+数,请画b+树的结构

91、mysql中的字符集,客户端与数据库不一致,怎么办? MYSQL中字符串到显示到界面,字符转换的过程是怎样的?数据库中的字符集是latin1,你现在将utf8的字符串存到latin1字符集的数据库表,你能将utf8的字符串存进去吗?假如你说能存,追问:能否恢复?假如能,那怎么恢复?

92、写一段代码,找到所有子集合,如[a,b,c]的子集合有{},{a},{b},{c},{ab},{ac},{abc}

93、['a'=>200,'b'=>100,'c'=>100],写一个自定义排序函数,按值降序,如果值一样,按键排序

94、设计一个缓存系统,可以定期或空间占满之后自动删除长期不用的数据,不能使用用遍历。

我当时的答案是用链表来存,缓存命中就将该缓存移到链表头,然后链表尾就都是冷数据了。 我记得之前是在哪里看过这个设计,但我忘记在连接了,请知道朋友的把连接贴上来。

95、=====的区别,写出以下输出:"aa"==1,"bb"==0,1=="1"

96、一个排序好的数组,将它从中间任意一个位置切分成两个数组,然后交换它们的位置并合并,合并后新数组元素如:20,21,22,25,30,1,2,3,5,6,7,8,15,18,19,写一个查询函数来查找某个值是否存在。

97、设计一个树形结构,再写一个函数对它进行层序遍历

98、'$var'和"$var"的区别

99、self和static的区别

100、PHP的协程以及用途

101、描述autoload的机制

102、mysql中字段类型各占几个字节:smallint【2】、int【4】、bigint【8】、datetime【4】、varchar(8)

103、哪些属性唯一确定一条TCP连接

源端口、目标端口、源ip、目标ip

104、myisam和innodb的区别,为什么myisam比innodb快,myisam和innodb的索引数据结构是什么样的?innodb主键索引和非主键索引的区别?其索引上存放的数据是什么样的?

105、断开TCP连接时,timewait状态会出现在发起分手的一端还是被分手的一端

出现在分手的一端。time_wait会持续2mls。由于网络的不稳定等因素,会导致ack发送失败。在2MLS内,可以重发。

  1. 被动关闭连接的一方在一段时间内没有收到对方的ACK确认数据包,会重新发送FIN数据包,因而主动关闭连接的一方需要停留在等待状态以处理对方重新发送的FIN数据包。否则他会回应一个RST数据包给被动关闭连接的一方,使得对方莫名其妙。

  2. 在TIME_WAIT状态下,不允许应用程序在当前ip和端口上和之前通信的client(这个client的ip和端口号不变)建立一个新的连接。这样就能避免新的连接收到之前的ip和端口一致的连接残存在网络中的数据包。这也是TIME_WAIT状态的等待时间被设置为2MSL的原因,以确保网络上当前连接两个方向上尚未接收的TCP报文已经全部消失。

106、AWK各种数据分析考得非常多,要多练习,题目不再一一写了

107、redis中集合、有序集合、hyperLog、hash的数据结构是啥样的

108、描述一下:一个请求到达nginx的全部处理过程(nginx自身会调用哪些逻辑)、然后怎么与php通信,中间的流程是什么样的等等?

109、nginx和php-fpm的相关配置,随便问里面各种参数啥意思

110、假如有一张地图,如下图,"-"代表海洋、"+"代表陆地,用你最擅长的方式,取出陆地的坐标。