昨天刚去新浪面试,趁着没忘(可惜还是忘了至少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, 输出最后那个大王的编号。
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);
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);
http://tieba.baidu.com/f?kz=307686067 这个是C++的算法
打开php.ini中的Safe_mode,会影响哪些参数?至少说出6个。比较变态的题目(如果不允许查手册的话)。而且是一大抄。error_reporting共有14个参数,至少要记住11种参数及意义。出题目的人都未必能回答Safe_mode在php6中属于淘汰技术。
===============================================
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);
/*
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>';
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] =>
)
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;
}
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怎么办?
level报告level小于2047的错误
$s = 0;
for ($i=2; $i<=$n; $i++) {
$s = ($s+$m)%$i;
}
$win = $s+1;
return $win;
}echo kickMonkey(10,3);
不知道$s = ($s+$m)%$i;是什么个意思?
但是不知道php里面有没有数据结构之说 学习php没多久
了解不太透彻呀...
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>";
除非提前知道答案不过也不算太过份,其实基本要求就是:手册要看上二三遍,计算机专业,一年以上PHP编程经验
{
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];
}
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);
}
};
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);
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;
}
}
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 ;
}
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);
?>