昨天刚去新浪面试,趁着没忘(可惜还是忘了至少4道题),赶快发出来,大家有兴趣的做做。1. echo count("abc"); 输出什么?2. echo,print()和print_r()有什么区别?3. 打开php.ini中的Safe_mode,会影响哪些参数?至少说出6个。4. 写个函数来解决多线程同时读写一个文件的问题。5. 写出一种排序算法(要写出代码),并说出优化它的方法。6. 写个函数用来对二维数组排序。7. 写5个不同的自己的函数,来截取一个全路径的文件的扩展名,允许封装php库中已有的函数。8. 一群猴子排成一圈,按1,2,...,n依次编号。然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去...,如此不停的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫做大王。要求编程模拟此过程,输入m、n, 输出最后那个大王的编号。

解决方案 »

  1.   

    我又想了想,又回忆了一些,一共13道题,应该差不多就是这些了:1. echo count("abc"); 输出什么?2. 用PHP写出显示客户端IP与服务器IP的代码3. error_reporting(2047)什么作用?4. echo,print()和print_r()有什么区别?5. 打开php.ini中的Safe_mode,会影响哪些参数?至少说出6个。6. 写个函数来解决多线程同时读写一个文件的问题。7. 请写一个函数验证电子邮件的格式是否正确(要求使用正则)8. 考SQL语句的题,题太长了,实在不好回忆了。9. MySQL数据库,一天一万条以上的增量,怎么优化?10. 写出一种排序算法(要写出代码),并说出优化它的方法。11. 写个函数用来对二维数组排序。12. 写5个不同的自己的函数,来截取一个全路径的文件的扩展名,允许封装php库中已有的函数。13. 一群猴子排成一圈,按1,2,...,n依次编号。然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去...,如此不停的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫做大王。要求编程模拟此过程,输入m、n, 输出最后那个大王的编号。
      

  2.   

    最后一题,不知道对与否,大家可以测试验证
    function re($n,$m)
    {
    $a = array(); 
    $b = array(); 
    for($i=0;$i<$n;$i++)
    {
    $a[$i]=$i+1;
    }
    $start=0;
    $k=0;
    for($i = $n;$i >= 2;$i--)      
                { 
                    $start = ($start + $m - 1) % $i; 
                    if ($start == 0) 
                        $start = i; 
                    $b[$k] = $a[$start]; 
                    $k++; 
                    for ($j = $start + 1; $j <= $i; $j++) 
                        $a[$j - 1] = $a[$j]; 
                }  
    $b[$k]=$a[0]; 
    return $b[$k];
    }
    echo re(10,3); 
      

  3.   

    上面写错了应该似乎
    function re($n,$m)
    {
    $a = array(); 
    $b = array(); 
    for($i=0;$i<$n;$i++)
    {
    $a[$i]=$i+1;
    }
    $start=0;
    $k=0;
    for($i = $n;$i >= 2;$i--)      
                { 
                    $start = ($start + $m - 1) % $i; 
                    $b[$k] = $a[$start]; 
                    $k++; 
                    for ($j = $start + 1; $j <= $i; $j++) 
                        $a[$j - 1] = $a[$j]; 
                }  
    $b[$k]=$a[0]; 
    return $b[$k];
    }
    echo re(10,3);
      

  4.   

    第十三题是约瑟夫环问题,相当经典的算法了
    http://tieba.baidu.com/f?kz=307686067 这个是C++的算法
      

  5.   

    error_reporting(2047)什么作用? 
    打开php.ini中的Safe_mode,会影响哪些参数?至少说出6个。比较变态的题目(如果不允许查手册的话)。而且是一大抄。error_reporting共有14个参数,至少要记住11种参数及意义。出题目的人都未必能回答Safe_mode在php6中属于淘汰技术。
      

  6.   

    Q8:记得学C语言时,好像就是用前后指针弄的.
    ===============================================
    function kickMonkey($n,$m)
    {
    /*monkeys array*/
    $monkeys = array();
    $before[1] = $n;
    for($i=1;$i<=$n;$i++)
    {
    $before[$i] = $i == 1 ? $n : $i-1;
    $next[$i]  = $i == $n ? 1 : $i+1;
    }
    $i = 1;
    $loop = 1;
    while($next[$next[$i]])
    {
    if($loop == $m)
    {
    $x = $next[$before[$i]] = $next[$i];
    $before[$next[$i]] = $before[$i];
    unset($next[$i]);
    $loop = 1;
    }
    else 
    {
    $x = $next[$i];
    $loop++;
    }
    $i = $x;
    }
    return $i;
    }
    echo "The king is monkey :".kickMonkey(10,4);
      

  7.   

    虽然用过N年的PHP,看了这些题,我准备转行了。
      

  8.   

    我贴一下猴子题我的解法,比较笨,但是测试过了,是正确的:
      /*
      13. 一群猴子排成一圈,按1,2,...,n依次编号。
      然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,
      再数到第m只,在把它踢出去...,如此不停的进行下去,
      直到最后只剩下一只猴子为止,那只猴子就叫做大王。
      要求编程模拟此过程,输入m、n, 输出最后那个大王的编号。
      */
      
      
      // 输入m,n. 本程序用6和4来举个例子
      $n = 6;
      $m = 4;
      
      $monkeys = array();
      
      for($i=1; $i<=$n; $i++){ //按1,2,...,n依次编号
          $monkeys[] = $i;
      }
      
      echo '<pre>';
      echo "start:";
      print_r($monkeys);  //输出初始状态
      
      $i = 0; //数组下标
      $z = 0; //数数的变量
      $c = $n; //用来记录还剩下的猴子个数
      while($c>1){ //只要剩下的猴子还多余一个,就继续循环
        
        if($i == $n){
          $i = 0;  //如果下标跑到头,就回0;用这个方法来模拟不停转圈。
        }
        if($monkeys[$i] != null){ //跳过之前已经踢出去的猴子
          $z++; // 往下数
        
          if($z == $m){ //如果数到了m
            $monkeys[$i] = null;  //数到第m只,把它踢出圈
    $c--; //猴子数量减1
    $z = 0;  //重新再数
    echo "temp:";
            print_r($monkeys); //这里去掉注释可以输出中间过程,看清踢出的顺序
          }  
        }
        
        $i++; //下标往下走
      }//while
      
      echo "final:";
      print_r($monkeys);//打印最后结果
      
      echo '</pre>';
      

  9.   

    运行结果如下:最后的大王编号是5
    start:Array
    (
        [0] => 1
        [1] => 2
        [2] => 3
        [3] => 4
        [4] => 5
        [5] => 6
    )
    temp:Array
    (
        [0] => 1
        [1] => 2
        [2] => 3
        [3] => 
        [4] => 5
        [5] => 6
    )
    temp:Array
    (
        [0] => 1
        [1] => 
        [2] => 3
        [3] => 
        [4] => 5
        [5] => 6
    )
    temp:Array
    (
        [0] => 
        [1] => 
        [2] => 3
        [3] => 
        [4] => 5
        [5] => 6
    )
    temp:Array
    (
        [0] => 
        [1] => 
        [2] => 
        [3] => 
        [4] => 5
        [5] => 6
    )
    temp:Array
    (
        [0] => 
        [1] => 
        [2] => 
        [3] => 
        [4] => 5
        [5] => 
    )
    final:Array
    (
        [0] => 
        [1] => 
        [2] => 
        [3] => 
        [4] => 5
        [5] => 
    )
      

  10.   

    有人说我的算法貌似有点复杂,那我注释一下吧,其实很简单,是个牺牲空间换取时间的思路。
    function kickMonkey($n,$m)
    {
            //构造前后指向的猴子环状链表
    for($i=1;$i<=$n;$i++)
    {
    $before[$i] = $i == 1 ? $n : $i-1;//当前猴子的前指向
    $next[$i]  = $i == $n ? 1 : $i+1;//当前猴子的后指向
    }
    $i = 1;
    $loop = 1;
            //如果还有下一只猴子
    while($next[$next[$i]])
    {
    if($loop == $m)
    {//踢除猴子
    $x = $next[$before[$i]] = $next[$i];//把前一只猴子的后指向改为下一只猴子
    $before[$next[$i]] = $before[$i];//把后一只猴子的前指向改为前一只猴子
    unset($next[$i]);//踢掉数到的猴子,直接踢掉,那下一次循环不会读到这只猴子了,所以循环只会越来越快
    $loop = 1;//从下一只猴子开始数
    }
    else 
    {//继续数数
    $x = $next[$i];//当前猴子不踢除的话,就数到下一只猴子
    $loop++;
    }
    $i = $x;
    }
    return $i;
    }
      

  11.   

    问一个关于error_reporting(2047)的问题,以下是官网手册中的值-常量对应表:
    1 E_ERROR  
    2 E_WARNING  
    4 E_PARSE  
    8 E_NOTICE  
    16 E_CORE_ERROR  
    32 E_CORE_WARNING  
    64 E_COMPILE_ERROR  
    128 E_COMPILE_WARNING  
    256 E_USER_ERROR  
    512 E_USER_WARNING  
    1024 E_USER_NOTICE  
    6143 E_ALL  
    2048 E_STRICT  
    4096 E_RECOVERABLE_ERROR  
    8192 E_DEPRECATED  
    16384 E_USER_DEPRECATED 原地址:http://cn.php.net/manual/en/function.error-reporting.php里面只找到2048的对应值,2047怎么办?
      

  12.   

    里面只找到2048的对应值,2047怎么办?-----------
    level报告level小于2047的错误
      

  13.   

    function kickMonkey ($n,$m) {
        $s = 0;
        for ($i=2; $i<=$n; $i++) {
            $s = ($s+$m)%$i;
        }
        $win = $s+1;
        return $win;
    }echo kickMonkey(10,3);
      

  14.   

    看来这个是Q8的最佳答案了,强悍.
    不知道$s = ($s+$m)%$i;是什么个意思?
      

  15.   

    解第13题的,题目没说 m < n 吧。
      

  16.   

    刚学习php,上面不少都不会的。我个人感觉考这些题有些是没必要,查查资料都有答案。
      

  17.   

      貌似最后一题就是经典的约瑟夫吧...用一个循环链表几行代码就解决了
    但是不知道php里面有没有数据结构之说   学习php没多久 
      了解不太透彻呀...
      

  18.   

    关于第10题:
    10. 写出一种排序算法(要写出代码),并说出优化它的方法。
    一开始,我也有点发懵,心想,让我写一种排序算法,我肯定是自己认为最优的了,怎么还要优化呢?
    这几天想了想,想明白这个题要考什么了。下面贴出我的答案:排序算法我选的是最普通的冒泡算法: $arr = array(70,8,23,95,46,14);
    $len = count($arr);

    for($i = 0; $i<$len-1; $i++){
    for($j = 0; $j<$len-1-$i;$j++){
    if($arr[$j]>$arr[$j+1]){
    swap($arr,$j,$j+1);
    }
    }
    }
    function swap(&$arr,$i,$j){
    $temp = $arr[$i];
    $arr[$i] = $arr[$j];
    $arr[$j] = $temp;
    } echo "<pre>";
    print_r($arr);
    echo "</pre>";
    关于对冒泡的优化,可以这样考虑,这个算法的消耗是n!,如果就这样不修改的话,那遇到特殊情况,比如本来数组就处于比较良好的排序状况,甚至一开始就是排好序的,那样的话,这个算法仍是消耗n!就比较浪费了。从这个角度去优化的话,可以增加个变量,用来监视每轮交换的次数,一旦发现交换次数为0,说明已经排好序了,就结束程序,减少开支。下面是优化过的冒泡算法: $arr = array(70,8,23,95,46,14);
    $len = count($arr);

    for($i = 0; $i<$len-1; $i++){
    $count = 0;
    for($j = 0; $j<$len-1-$i;$j++){
    if($arr[$j]>$arr[$j+1]){
    swap($arr,$j,$j+1);
    $count++;
    }
    }
    if(!$count){//如果到这里count仍为0,说明之前一次交换也没发生过,也就是说排序已经完成了
    break;  //那就可以结束了。
    }
    }
    function swap(&$arr,$i,$j){
    $temp = $arr[$i];
    $arr[$i] = $arr[$j];
    $arr[$j] = $temp;
    } echo "<pre>";
    print_r($arr);
    echo "</pre>";
      

  19.   

    就我个人经验,几乎所有的PHP面试都会考这类“查查资料就都有答案”的题目,如果你跟面试管说这些东西以后工作中都可以查手册,所以记不记都无所谓,那面试官绝对会在第一轮把你咔嚓掉。我也很讨厌背这些手册上的东西,但是现实就是这样,没办法。如果你学PHP纯是为了兴趣,那当我没说;如果你想靠它吃饭,这个问题就得小心了。
      

  20.   

    这种题目,即使是拿到新浪里测,估计80%以上也都不及格
    除非提前知道答案不过也不算太过份,其实基本要求就是:手册要看上二三遍,计算机专业,一年以上PHP编程经验
      

  21.   

    规规矩矩的按过程function monkeys($m,$n)
    {
    if ($n==1)return 1;
    for ($i=1;$i<=$n;$i++){
    $monkeys[$i] = $i;
    }
    for ($i=$n;$i>1;$i--){
    $j = $m;
    while ($i<$j){
    $j = $j-$i;
    }
    unset($monkeys[$j]);
    $k=1;
    foreach ($monkeys as $item){
    $nmonkeys[$k++] = $item;
    }
    $monkeys = $nmonkeys;
    unset($nmonkeys);
    //print_r($monkeys);
    //echo "<br>";
    }
    return $monkeys[1];
    }
      

  22.   


    class ChoiceMonkeyKing
    {
    int *m_npMonkeyList;
    int m_nMonkeyCount;
    int m_nWhatCounter;
    int m_nStartPoint;
    public:
    ChoiceMonkeyKing(const int nMonkeyCount,const int nWhatCounter,int *npMonkeyList=NULL,const int nStartPoint=0):
      m_nMonkeyCount(nMonkeyCount),m_nWhatCounter(nWhatCounter),m_nStartPoint(nStartPoint)
    {
    m_npMonkeyList=new int[nMonkeyCount];
    if(npMonkeyList==NULL)
    {
    for(int i=0;i<nMonkeyCount;i++)
    {
    m_npMonkeyList[i]=i+1;
    }
    }
    else
    {
    for(int i=0,j=0;i<=nMonkeyCount;i++)
    {
    if(npMonkeyList[i])
    {
    m_npMonkeyList[j++]=npMonkeyList[i];
    }
    }
    }
    }
    ~ChoiceMonkeyKing()
    {
    delete m_npMonkeyList;
    }
    operator int() const
    {
    if(m_nMonkeyCount==1) return m_npMonkeyList[0];
    int point=m_nStartPoint+m_nWhatCounter-1;
    while(point>=m_nMonkeyCount)
    {
    point-=m_nMonkeyCount;
    }
    m_npMonkeyList[point]=0;
    if(point>=m_nMonkeyCount-1)
    {
    point=0;
    }
    return ChoiceMonkeyKing(m_nMonkeyCount-1,m_nWhatCounter,m_npMonkeyList,point);
    }
    };
      

  23.   

    以上是我用C++的算法,不知道PHP能否定义class?使用方法:int k=ChoiceMonkeyKing(6,4);
      

  24.   

    //每次踢出一个值,到总数小于m时怎么办?小弟设定总数小于或者等于M时,跳出循环,取数组的第一个值为结果!
    function getking($m,$n){
    for($i=1;$i<$n+1;$i++){
    $countmonkey.=$i.'|';
    }
    return mking($m,$countmonkey);
    }
    function mking($m,$str){
    $str=substr($str,0,-1);
    $arr = explode('|',$str);
    for($i=$m-1;$i<count($arr);$i++){
    if(!empty($arr[$i+1])){
    $arrnew[]=$arr[$i+1];
    }
    }
    for($j=0;$j<$m;$j++){
    if(!empty($arr[$j-1])){
    $arrnew[]=$arr[$j-1];
    }
    }
    if(count($arrnew) == $m || (count($arrnew) < $m)){
    //print_r($arrnew);
    return $arrnew[0];
    break;
    }else{
    $str='';
    for($k=0;$k<count($arrnew);$k++){
    $str.=$arrnew[$k].'|';
    }
    return mking($m,$str);
    }
    }
    echo getking(3,10);
      

  25.   

    en ,,学习一下13题好常见了,我原来也写过用的java
      

  26.   

    我的思路,采用回调函数:
    function dovote($m,$n){
    $arr = range(1,$n,1);//生成1-n数组组成的数组
    $result = dogetlastnum(&$arr,$m);
    return $result;
    }/*
    *去除第$m数,返回最后剩下的指
    */
    function dogetlastnum(&$arr,$m){
    if(count($arr == 1)){
    return $arr[0];

    else{
    $thenum = $m%count($arr)-1;
    array_splice(&$arr,$thenum,1);
    $result = dogetlastnum(&$arr,$m);
    return $result;
    }
    }
      

  27.   

    echo count("abc"); 输出什么? 应该是1吧
      

  28.   

    试试这样:
    function king($m ,$n)
    {
      //构造数组
      for($i=1 ;$i<$m+1 ;$i++){
        $arr[] = $i ;
      }
      $i = 0 ;    //设置数组指针while(count($arr)>1)
    {
       //遍历数组,判断当前猴子是否为出局序号,如果是则出局,否则放到数组最后
       if(($i+1)%$n ==0) {
        unset($arr[$i]) ;
       } else {
        array_push($arr ,$arr[$i]) ; //本轮非出局猴子放数组尾部
        unset($arr[$i]) ;   //删除
       }
       $i++ ;
    }
    return $arr ;
    }
      

  29.   

    我的算法,看样子比较烂<?php
    function kickMonkey($count = 10, $step = 3){
        $monkey = array();
        for ($i=1; $i<=$count; $i++){
    $monkey[$i] = $i;
        }
        $pos = 1;
        for ($i=1; $i<$count; $i++){
            $kick = $step;
    while ($kick){
        if ($pos > $count){
    $pos = 1;
        }
        if ($monkey[$pos] != null){
    $kick--;
        }
        if ($kick == 0){
    $monkey[$pos] = null;
        }
        $pos++;
    }
        }
        $result = array_keys(array_filter($monkey));
        return $result[0];
    }
    echo kickMonkey(10, 3);
    ?>