二、数据结构和算法

1.使对象可以像数组一样进行foreach循环,要求属性必须是私有。(Iterator模式的PHP5实现,写一类实现Iterator接口)(腾讯)
  1. <?php
  2. class Test implements Iterator{
  3. private $item = array('id'=>1,'name'=>'php');
  4. public function rewind(){
  5. reset($this->item);
  6. }
  7. public function current(){
  8. return current($this->item);
  9. }
  10. public function key(){
  11. return key($this->item);
  12. }
  13. public function next(){
  14. return next($this->item);
  15. }
  16. public function valid(){
  17. return($this->current()!==false);
  18. }
  19. }
  20. //测试
  21. $t=new Test;
  22. foreach($t as $k=>$v){
  23. echo$k,'--->',$v,'<br/>';
  24. }
  25. ?>
2.用PHP实现一个双向队列(腾讯)
  1. <?php
  2. class Deque{
  3. private $queue=array();
  4. public function addFirst($item){
  5. return array_unshift($this->queue,$item);
  6. }
  7. public function addLast($item){
  8. return array_push($this->queue,$item);
  9. }
  10. public function removeFirst(){
  11. return array_shift($this->queue);
  12. }
  13. public function removeLast(){
  14. return array_pop($this->queue);
  15. }
  16. }
  17. ?>
3.请使用冒泡排序法对以下一组数据进行排序10 2 36 14 10 25 23 85 99 45。
  1. <?php
  2. // 冒泡排序
  3. function bubble_sort(&$arr){
  4. for ($i=0,$len=count($arr); $i < $len; $i++) {
  5. for ($j=1; $j < $len-$i; $j++) {
  6. if ($arr[$j-1] > $arr[$j]) {
  7. $temp = $arr[$j-1];
  8. $arr[$j-1] = $arr[$j];
  9. $arr[$j] = $temp;
  10. }
  11. }
  12. }
  13. }
  14. // 测试
  15. $arr = array(10,2,36,14,10,25,23,85,99,45);
  16. bubble_sort($arr);
  17. print_r($arr);
  18. ?>
4.写出一种排序算法(要写出代码),并说出优化它的方法。(新浪)
  1. <?php
  2. //快速排序
  3. function partition(&$arr,$low,$high){
  4. $pivotkey = $arr[$low];
  5. while($low<$high){
  6. while($low < $high && $arr[$high] >= $pivotkey){
  7. $high--;
  8. }
  9. $temp = $arr[$low];
  10. $arr[$low] = $arr[$high];
  11. $arr[$high] = $temp;
  12. while($low < $high && $arr[$low] <= $pivotkey){
  13. $low++;
  14. }
  15. $temp=$arr[$low];
  16. $arr[$low]=$arr[$high];
  17. $arr[$high]=$temp;
  18. }
  19. return$low;
  20. }
  21. function quick_sort(&$arr,$low,$high){
  22. if($low < $high){
  23. $pivot = partition($arr,$low,$high);
  24. quick_sort($arr,$low,$pivot-1);
  25. quick_sort($arr,$pivot+1,$high);
  26. }
  27. }
  28. ?>

算法是通过分治递归来实现的,其效率很大程度上取决于参考元素的选择,可以选择数组的中间元素,也可以随机得到三个元素,然后选择中间的那个元素(三数中值法)。
另外还有一点,就是当我们在分割时,如果分割出来的子序列的长度很小的话(小于5到20),通常递归的排序的效率就没有诸如插入排序或希尔排序那么快了。因此可以会去判断数组的长度,如果小于10的话,直接用插入排序,而不再递归调用这个快速排序。

5.一群猴子排成一圈,按1,2,...,n依次编号。然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去...,如此不停的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫做大王。要求编程模拟此过程,输入m、n,输出最后那个大王的编号。(新浪)(小米)

这是著名的约瑟夫环问题

  1. <?php
  2. // 方案一,使用php来模拟这个过程
  3. function king($n,$m){
  4. $mokey = range(1, $n);
  5. $i = 0;
  6. while (count($mokey) >1) {
  7. $i += 1;
  8. $head = array_shift($mokey);//一个个出列最前面的猴子
  9. if ($i % $m !=0) {
  10. #如果不是m的倍数,则把猴子返回尾部,否则就抛掉,也就是出列
  11. array_push($mokey,$head);
  12. }
  13. }
           // 剩下的最后一个就是大王了
  14. return $mokey[0];
  15. }
  16. // 测试
  17. echo king(10,7);
  18. // 方案二,使用数学方法解决
  19. function josephus($n,$m){
  20. $r = 0;
  21. for ($i=2; $i <= $m ; $i++) {
  22. $r = ($r + $m) % $i;
  23. }
  24. return $r+1;
  25. }
  26. // 测试
  27. print_r(josephus(10,7));
  28. ?>
6.写一个二维数组排序算法函数,能够具有通用性,可以调用php内置函数。
  1. <?php
  2. //二维数组排序,$arr是数据,$keys是排序的健值,$order是排序规则,1是降序,0是升序
  3. function array_sort($arr,$keys,$order=0){
  4. if(!is_array($arr)){
  5. return false;
  6. }
  7. $keysvalue=array();
  8. foreach($arr as $key => $val){
  9. $keysvalue[$key] = $val[$keys];
  10. }
  11. if($order == 0){
  12. asort($keysvalue);
  13. }else{
  14. arsort($keysvalue);
  15. }
  16. reset($keysvalue);
  17. foreach($keysvalue as $key => $vals){
  18. $keysort[$key] = $key;
  19. }
  20. $new_array=array();
  21. foreach($keysort as $key=> $val){
  22. $new_array[$key]=$arr[$val];
  23. }
  24. return$new_array;
  25. }
  26. //测试
  27. $person=array(
  28. array('id'=>2,'name'=>'zhangsan','age'=>23),
  29. array('id'=>5,'name'=>'lisi','age'=>28),
  30. array('id'=>3,'name'=>'apple','age'=>17)
  31. );
  32. $result = array_sort($person,'name',1);
  33. print_r($result);
  34. ?>
7.用二分法查找一个长度为10的排好序的线性表,查找不成功时最多需要比较次数是(小米)

4

8.从0,1,2,3,4,5,6,7,8,9,这十个数字中任意选出三个不同的数字,“三个数字中不含0和5”的概率是(小米)

7/15

9.一个三角形三个顶点有3只老鼠,一声枪响,3只老鼠开始沿三角形的边匀速运动,请问他们相遇的概率是(小米)

75%,每只老鼠都有顺时针、逆时钟两种运动方向,3只老鼠共有8种运动情况,只有当3只老鼠都为顺时针或者逆时钟,它们才不会相遇,剩余的6中情况都会相遇,故相遇的概率为6/8=75%。

10.描述顺序查找和二分查找(也叫做折半查找)算法,顺序查找必须考虑效率,对象可以是一个有序数组(小米)
  1. <?php
  2. /**
  3. * 顺序查找
  4. * @param array $arr 数组
  5. * @param $k 要查找的元素
  6. * @return mixed 成功返回数组下标,失败返回-1
  7. */
  8. function seq_sch($arr,$k){
  9. for ($i=0,$n = count($arr); $i < $n; $i++) {
  10. if ($arr[$i] == $k) {
  11. break;
  12. }
  13. }
  14. if($i < $n){
  15. return $i;
  16. }else{
  17. return -1;
  18. }
  19. }
  20. /**
  21. * 二分查找,要求数组已经排好顺序
  22. * @param array $array 数组
  23. * @param int $low 数组起始元素下标
  24. * @param int $high 数组末尾元素下标
  25. * @param $k 要查找的元素
  26. * @return mixed 成功时返回数组下标,失败返回-1
  27. */
  28. function bin_sch($array,$low,$high,$k){
  29. if ($low <= $high) {
  30. $mid = intval(($low + $high) / 2);
  31. if ($array[$mid] == $k) {
  32. return $mid;
  33. } elseif ($k < $array[$mid]) {
  34. return bin_sch($array,$low,$mid - 1,$k);
  35. } else{
  36. return bin_sch($array,$mid + 1,$high,$k);
  37. }
  38. }
  39. return -1;
  40. }
  41. // 测试:顺序查找
  42. $arr1 = array(9,15,34,76,25,5,47,55);
  43. echo seq_sch($arr1,47);//结果为6
  44. echo "<br />";
  45. // 测试:二分查找
  46. $arr2 = array(5,9,15,25,34,47,55,76);
  47. echo bin_sch($arr2,0,7,47);//结果为5
  48. ?>
11.我们希望开发一款扑克游戏,请给出一套洗牌算法,公平的洗牌并将洗好的牌存储在一个整形数组里。(鑫众人云)
  1. <?php
  2. $card_num = 54;//牌数
  3. function wash_card($card_num){
  4. $cards = $tmp = array();
  5. for($i = 0;$i < $card_num;$i++){
  6. $tmp[$i] = $i;
  7. }
  8. for($i = 0;$i < $card_num;$i++){
  9. $index = rand(0,$card_num-$i-1);
  10. $cards[$i] = $tmp[$index];
  11. unset($tmp[$index]);
  12. $tmp = array_values($tmp);
  13. }
  14. return $cards;
  15. }
  16. // 测试:
  17. print_r(wash_card($card_num));
  18. ?>
12.写出你所知道的排序方法(亿邮)

冒泡排序,快速排序,插入排序,选择排序

php面试之数据结构和算法的更多相关文章

  1. 大公司面试经典数据结构与算法题C#/Java解答

    几个大公司(IBM.MicroSoft and so on)面试经典数据结构与算法题C#解答 1.链表反转 我想到了两种比较简单的方法 第一种是需要开一个新的链表,将原链表的元素从后到前的插入到新链表 ...

  2. 面试常考的常用数据结构与算法(zz)

    数据结构与算法,这个部分的内容其实是十分的庞大,要想都覆盖到不太容易.在校学习阶段我们可能需要对每种结构,每种算法都学习,但是找工作笔试或者面试的时候,要在很短的时间内考察一个人这方面的能力,把每种结 ...

  3. C++程序员面试题目总结(涉及C++基础、多线程多进程、网络编程、数据结构与算法)

     说明:C++程序员面试题目总结(涉及C++基础知识.多线程多进程.TCP/IP网络编程.Linux操作.数据结构与算法) 内容来自作者看过的帖子或者看过的文章,个人整理自互联网,如有侵权,请联系作者 ...

  4. 数据结构与算法-江西师范大学865(针对考研or面试)

    可以加我微信chenyoudea免费要江西师范大学865资料全套pdf 目录 第一篇 数据结构与算法(针对考研or面试) 第二篇 真题演练 第三篇 复试 第四篇 推荐阅读 第一篇 数据结构与算法(针对 ...

  5. 数据结构与算法JavaScript (一) 栈

    序 数据结构与算法JavaScript这本书算是讲解得比较浅显的,优点就是用javascript语言把常用的数据结构给描述了下,书中很多例子来源于常见的一些面试题目,算是与时俱进,业余看了下就顺便记录 ...

  6. 翻阅《数据结构与算法javascript描述》--数组篇

    导读: 这篇文章比较长,介绍了数组常见的操作方法以及一些注意事项,最后还有几道经典的练习题(面试题). 数组的定义: JavaScript 中的数组是一种特殊的对象,用来表示偏移量的索引是该对象的属性 ...

  7. 数据结构与算法javascript描述

    <数据结构与算法javascript描述>--数组篇 导读: 这篇文章比较长,介绍了数组常见的操作方法以及一些注意事项,最后还有几道经典的练习题(面试题). 数组的定义: JavaScri ...

  8. Python 数据结构和算法

    阅读目录 什么是算法 算法效率衡量 算法分析 常见时间复杂度 Python内置类型性能分析 数据结构 顺序表 链表 栈 队列 双端队列 排序与搜索 冒泡排序 选择排序 插入排序 希尔排序 快速排序 归 ...

  9. Java数据结构和算法(一)线性结构

    Java数据结构和算法(一)线性结构 数据结构与算法目录(https://www.cnblogs.com/binarylei/p/10115867.html) 线性表 是一种逻辑结构,相同数据类型的 ...

随机推荐

  1. PhiloGL学习(4)——三维对象、加载皮肤

    前言 上一篇文章中介绍了如何响应鼠标和键盘事件,本文介绍如何加载三维对象并实现给三维对象添加一个漂亮的皮肤. 一. 原理分析 我对三维的理解为:所谓三维对象无非是多个二维对象拼接到一起,贴图就更简单了 ...

  2. 基于HTML5及WebGL的工控SCADA模拟飞机飞行

    昨天看到一篇文章说是学习如何开飞机的,然后我就想,如果我也可以开飞机那就好玩了,每个人小时候都想做飞行员!中国飞行员太难当了,再说也不轻易让你开飞机!后来我就想如果能用 HT 开飞机那就是真的有趣了, ...

  3. Java基础笔记10

    类的设计分析: 1.根据需求抽取属性.(名词几乎都是属性) 2.属性私有化(private) 3.生成setter和getter方法 4.可以根据需要添加构造函数. 5.根据需求抽取其他方法.(动词几 ...

  4. Java语言实现机制

    Java语言实现机制 1.Java虚拟机(Java Virtual Machine) Java虚拟机(JVM)是在一台计算机上由软件模拟也可以用硬件来实现的假想的计算机.它定义了指令集(相当于中央处理 ...

  5. 【Win 10 应用开发】UI Composition 札记(二):基本构件

    在上一篇中,老周用一个示例,演示了框架视图的创建过程,在本篇中,老周将给大伙伴们说一下 Composition 构建 UI 的一些“零件”. UI Composition 有一个核心类——对,就是 C ...

  6. 2017 多校训练 1006 Function

    Function Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total ...

  7. css 3d

    Perspective  透视点,视角,CSS3D 的透视点在浏览器前方 默认值为none,是作用于子元素,指定观察者与z=0平面的距离,使具有三维位置变换的元素产生透视效果.z>0的三维元素比 ...

  8. Problem H: STL——括号匹配

    Description 给出一堆括号,看其是否匹配,例如 ().()().(()) 这样的括号就匹配,       )(.)()) 而这样的括号就不匹配 Input 每一行代表一组测试样例,每组测试样 ...

  9. linux-more

    more 这个命令可以用来分页查看大篇幅的文件内容非常有效 命令参数: -num  : 这里的num 是一个数字,用来指定分页显示时每页的行数 +num  : 指定从文件的第几行num开始显示 ... ...

  10. StackExchange.Redis的使用 Redis五种数据类型的应用

    ConnectionMultiplexer ConnectionMultiplexer 是StackExchange.Redis的核心对象,用这个类的实例来进行Redis的一系列操作,对于一个整个应用 ...