明天就双十一了,准备好剁手了吗?我是没什么买的了,今天给大家推荐一些 PHP 面试题。
反转函数的实现/**
* 反转数组
* @param array $arr
* @return array
*/
function reverse($arr)
{
$n = count($arr);
$left = 0;
$right = $n - 1;
while ($left < $right) {
$temp = $arr[$left];
$arr[$left++] = $arr[$right];
$arr[$right--] = $temp;
}
return $arr;
}
>>> reverse(range(1,10))
=> [
10,
9,
8,
7,
6,
5,
4,
3,
2,
1,
]
两个有序int集合是否有相同元素的最优算法/**
* 寻找两个有序数组里相同的元素
* @param array $arr1
* @param array $arr2
* @return array
*/
function find_common($arr1, $arr2)
{
$common = array();
$i = $j = 0;
$count1 = count($arr1);
$count2 = count($arr2);
while ($i < $count1 && $j < $count2) {
if ($arr1[$i] < $arr2[$j]) {
$i++;
} elseif ($arr1[$i] > $arr2[$j]) {
$j++;
} else {
$common[] = $arr1[$i];
$i++;
$j++;
}
}
return array_unique($common);
}
print_r(find_common(range(1,10),range(5,15)));
Array
(
[0] => 5
[1] => 6
[2] => 7
[3] => 8
[4] => 9
[5] => 10
)
将一个数组中的元素随机/**
* 打乱数组
* @param array $arr
* @return array
*/
function custom_shuffle($arr)
{
$n = count($arr);
for ($i = 0; $i < $n; $i++) {
$rand_pos = mt_rand(0, $n);
if ($rand_pos != $i) {
$temp = $arr[$i];
$arr[$i] = $arr[$rand_pos];
$arr[$rand_pos] = $temp;
}
}
return $arr;
}
>>> custom_shuffle(range(1,5))
=> [
5,
3,
1,
4,
2,
]
给一个有数字和字母的字符串,让连着的数字和字母对应function number_Alphabet($str)
{
$number = preg_split('/[a-z]+/', $str, -1, PREG_SPliT_NO_EMPTY);
$Alphabet = preg_split('/\d+/', $str, -1, PREG_SPliT_NO_EMPTY);
$n = count($number);
for ($i = 0; $i < $count; $i++) {
echo $number[$i] . ':' . $Alphabet[$i] . '</br>';
}
}
$str = '1a3bb44a2ac';
number_Alphabet($str);//1:a 3:bb 44:a 2:ac
求n以内的质数/**
* 求n内的质数
* @param int $n
* @return array
*/
function get_prime($n)
{
$prime = array(2);//2为质数
for ($i = 3; $i <= $n; $i += 2) {//偶数不是质数,步长可以加大
$sqrt = intval(sqrt($i));//求根号n
for ($j = 3; $j <= $sqrt; $j += 2) {//i是奇数,当然不能被偶数整除,步长也可以加大。
if ($i % $j == 0) {
break;
}
}
if ($j > $sqrt) {
array_push($prime, $i);
}
}
return $prime;
}
>>> get_prime(10)
=> [
2,
3,
5,
7,
]
约瑟夫环问题一群猴子排成一圈,按1,2,…,n依次编号。然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数, 再数到第m只,在把它踢出去…,如此不停的进行下去, 直到最后只剩下一只猴子为止,那只猴子就叫做大王。要求编程模拟此过程,输入m、n, 输出最后那个大王的编号
/**
* 获取大王
* @param int $n
* @param int $m
* @return int
*/
function get_king_mokey($n, $m)
{
$arr = range(1, $n);
$i = 0;
while (count($arr) > 1) {
$i++;
$survice = array_shift($arr);
if ($i % $m != 0) {
array_push($arr, $survice);
}
}
return $arr[0];
}
var_dump(get_king_mokey(10,10));//8
function getKingMokey($n, $m)
{
$monkey[0] = 0;
//将1-n只猴子顺序编号 入数组中
for($i= 1; $i<= $n; $i++)
{
$monkey[$i] = $i;
}
$len = count($monkey);
//循环遍历数组元素(猴子编号)
for($i= 0; $i< $len; $i= $i)
{
$num = 0;
/*
* 遍历$monkey数组,计算数组中值不为0的元素个数(剩余猴子的个数)
* 赋值为$num,并获取值不为0的元素的元素值
*/
foreach($monkey as $key => $value)
{
if($value == 0) continue;
$num++;
$values = $value;
}
//若只剩一只猴子 则输出该猴子编号(数组元素值) 并退出循环
if($num == 1)
{
return $values;
exit;
}
/*
* 若剩余猴子数大于1($num > 1)
* 继续程序
*/
//将第$i只猴子踢出队伍(相应数组位置元素值设为0)
$monkey[$i] = 0;
/*
* 获取下一只需要踢出队伍的猴子编号
* 在$m值范围内遍历猴子 并设置$m的计数器
* 依次取下一猴子编号
* 若元素值为0,则该位置的猴子已被踢出队伍
* 若不为0,继续获取下一猴子编号,且计数器加1
* 若取得的猴子编号大于数组个数
* 则从第0只猴子开始遍历(数组指针归零) 步骤同上
* 直到计数器到达$m值 * 最后获取的$i值即为下一只需要踢出队伍的猴子编号
*/
//设置计数器
for($j= 1; $j<= $m; $j++)
{
//猴子编号加一,遍历下一只猴子
$i++;
//若该猴子未被踢出队伍,获取下一只猴子编号
if($monkey[$i] > 0) continue;
//若元素值为0,则猴子已被踢出队伍,进而循环取下一只猴子编号
if($monkey[$i] == 0)
{
//取下一只猴子编号
for($k= $i; $k< $len; $k++)
{
//值为0,编号加1
if($monkey[$k] == 0) $i++;
//否则,编号已取得,退出
if($monkey[$k] > 0) break;
}
}
//若编号大于猴子个数,则从第0只猴子开始遍历(数组指针归零) 步骤同上
if($i == $len) $i = 0;
//同上步骤,获取下一只猴子编号
if($monkey[$i] == 0)
{
for($k= $i; $k< $len; $k++)
{
if($monkey[$k] == 0) $i++;
if($monkey[$k] > 0) break;
}
}
}
}
}
//猴子个数
$n = 10;
//踢出队伍的编号间隔值
$m = 3;
//调用猴王获取函数https://9iPHP.com/web/PHP/1112.HTML
echo getKingMokey($n, $m)."是猴王";
function yuesefu($n,$m) {
$r=0;
for($i=2; $i<=$n; $i++) {
$r=($r+$m)%$i;
}
return $r+1;
}
echo yuesefu(10,3)."是猴王";
快速寻找一个数组里最小的1000个数//输入n个整数,输出其中最小的k个。
/**
* 获取最小的k个数
* @param array $arr
* @param int $k [description]
* @return array
*/
function get_min_array($arr, $k)
{
$n = count($arr);
$min_array = array();
for ($i = 0; $i < $n; $i++) {
if ($i < $k) {
$min_array[$i] = $arr[$i];
} else {
if ($i == $k) {
$max_pos = get_max_pos($min_array);
$max = $min_array[$max_pos];
}
if ($arr[$i] < $max) {
$min_array[$max_pos] = $arr[$i];
$max_pos = get_max_pos($min_array);
$max = $min_array[$max_pos];
}
}
}
return $min_array;
}
/**
* 获取最大的位置
* @param array $arr
* @return array
*/
function get_max_pos($arr)
{
$pos = 0;
for ($i = 1; $i < count($arr); $i++) {
if ($arr[$i] > $arr[$pos]) {
$pos = $i;
}
}
return $pos;
}
$array = [1, 100, 20, 22, 33, 44, 55, 66, 23, 79, 18, 20, 11, 9, 129, 399, 145, 2469, 58];
$min_array = get_min_array($array, 10);
print_r($min_array);
Array
(
[0] => 1
[1] => 18
[2] => 20
[3] => 22
[4] => 33
[5] => 44
[6] => 9
[7] => 11
[8] => 23
[9] => 20
)
在有序的数组中找到一个数的位置/**
* 二分查找
* @param array $array 数组
* @param int $n 数组数量
* @param int $value 要寻找的值
* @return int
*/
function binary_search($array, $n, $value)
{
$left = 0;
$right = $n - 1;
while ($left <= $right) {
$mID = intval(($left + $right) / 2);
if ($value > $mID) {
$right = $mID + 1;
} elseif ($value < $mID) {
$left = $mID - 1;
} else {
return $mID;
}
}
return -1;
}
>>> binary_search(range(1,5),5,2)
=> 2
一个有序整数序列,找出绝对值最小的元素/**
* 获取绝对值最小的元素
* @param array $arr
* @return int
*/
function get_min_abs_value($arr)
{
//如果符号相同,直接返回
if (is_same_sign($arr[0], $arr[$n - 1])) {
return $arr[0] >= 0 ? $arr[0] : $arr[$n - 1];
}
//二分查找
$n = count($arr);
$left = 0;
$right = $n - 1;
while ($left <= $right) {
if ($left + 1 === $right) {
return abs($arr[$left]) < abs($arr[$right]) ? $arr[$left] : $arr[$right];
}
$mID = intval(($left + $right) / 2);
if ($arr[$mID] < 0) {
$left = $mID + 1;
} else {
$right = $mID - 1;
}
}
}
/**
* 判断符号是否相同
* @param int $a
* @param int $b
* @return boolean
*/
function is_same_sign($a, $b)
{
if ($a * $b > 0) {
return true;
} else {
return false;
}
}
找出有序数组中随机3个数和为0的所有情况function three_sum($arr)
{
$n = count($arr);
$return = array();
for ($i=0; $i < $n; $i++) {
$left = $i + 1;
$right = $n - 1;
while ($left <= $right) {
$sum = $arr[$i] + $arr[$left] + $arr[$right];
if ($sum < 0) {
$left++;
} elseif ($sum > 0) {
$right--;
} else {
$numbers = $arr[$i] . ',' . $arr[$left] . ',' . $arr[$right];
if (!in_array($numbers, $return)) {
$return[] = $numbers;
}
$left++;
$right--;
}
}
}
return $return;
}
$arr = [-10, -9, -8, -4, -2, 0, 1, 2, 3, 4, 5, 6, 9];
var_dump(three_sum($arr));
>>> three_sum($arr)
=> [
"-10,1,9",
"-10,4,6",
"-10,5,5",
"-9,0,9",
"-9,3,6",
"-9,4,5",
"-8,2,6",
"-8,3,5",
"-8,4,4",
"-4,-2,6",
"-4,0,4",
"-4,1,3",
"-4,2,2",
"-2,0,2",
"-2,1,1",
]
任意n个正负整数里面最大的连续和/**
* 获取最大的连续和
* @param array $arr
* @return int
*/
function max_sum_array($arr)
{
$currSum = 0;
$maxSum = 0;//数组元素全为负的情况,返回最大数
$n = count($arr);
for ($i = 0; $i < $n; $i++) {
if ($currSum >= 0) {
$currSum += $arr[$i];
} else {
$currSum = $arr[$i];
}
}
if ($currSum > $maxSum) {
$maxSum = $currSum;
}
return $maxSum;
}
>>> max_sum_array([1,6,2,3,8])
=> 20
http中GET与POST的区别GET在浏览器回退时是无害的,而POST会再次提交请求。
GET产生的URL地址可以被Bookmark,而POST不可以。
GET请求会被浏览器主动cache,而POST不会,除非手动设置。
GET请求只能进行url编码,而POST支持多种编码方式。
GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
GET请求在URL中传送的参数是有长度限制的,而POST没有。
对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
GET参数通过URL传递,POST放在Request body中。
GET产生一个TCP数据包,POST产生两个TCP数据包。
cookie和SESSION的区别和关系cookie保存在客户端,而SESSION则保存在服务器端
从安全性来讲,SESSION的安全性更高
从保存内容的类型的角度来讲,cookie只保存字符串(及能够自动转换成字符串)
从保存内容的大小来看,cookie保存的内容是有限的,比较小,而SESSION基本上没有这个限制
从性能的角度来讲,用SESSION的话,对服务器的压力会更大一些
SEEION依赖于cookie,但如果禁用cookie,也可以通过url传递
统计某一天网站的访问量awk '{print $1}' /var/log/access.log | sort | uniq | wc -l
fastcgi通过端口监听和通过文件监听的区别监听方式 形式 Nginx链接fastcgi方式
端口监听 fastcgi_pass 127.0.0.1:9000 TCP链接
文件监听 fastcgi_pass /tmp/PHP_cgi.sock Unix domain Socket
Memcache与Redis的区别Memcache
该产品本身特别是数据在内存里边的存储,如果服务器突然断电,则全部数据就会丢失
单个key(变量)存放的数据有1M的限制
存储数据的类型都是String字符串类型
本身没有持久化功能
可以使用多核(多线程)
Redis
数据类型比较丰富:String、List、Set、Sortedset、Hash
有持久化功能,可以把数据随时存储在磁盘上
本身有一定的计算功能
单个key(变量)存放的数据有1GB的限制
redis 内存不够,使用 bitset
多进程同时写一个文件的问题function write($str)
{
$fp = fopen($file, 'a');
do {
usleep(100);
} while (!flock($fp, LOCK_EX));
fwrite($fp, $str . PHP_Eol);
flock($fp, LOCK_UN);
fclose($fp);
}
PHP7新特性?? 运算符(NulL 合并运算符)
函数返回值类型声明
标量类型声明
use 批量声明
define 可以定义常量数组
闭包( Closure)增加了一个 call 方法
验证ipfunction check_ip($ip)
{
if (!filter_var($ip, FILTER_VALIDATE_IP)) {
return false;
} else {
return true;
}
}
验证日期是否合理function check_datetime($datetime)
{
if (date('Y-m-d H:i:s', strtotime($datetime)) === $datetime) {
return true;
} else {
return false;
}
}
设计一个秒杀系统$ttl = 4;
$random = mt_rand(1,1000).'-'.gettimeofday(true).'-'.mt_rand(1,1000);
$lock = fasle;
while (!$lock) {
$lock = $redis->set('lock', $random, array('nx', 'ex' => $ttl));
}
if ($redis->get('goods.num') <= 0) {
echo ("秒杀已经结束");
//删除锁
if ($redis->get('lock') == $random) {
$redis->del('lock');
}
return false;
}
$redis->decr('goods.num');
echo ("秒杀成功");
//删除锁
if ($redis->get('lock') == $random) {
$redis->del('lock');
}
return true;
给某个ip找到对应的省和市//ip2long,把所有城市的最小和最大Ip录进去
$redis_key = 'ip';
$redis->zAdd($redis_key, 20, '#bj');//北京的最小IP加#
$resID->zAdd($redis_key, 30, 'bj');//最大IP
function get_ip_city($ip_address)
{
$ip = ip2long($ip_address);
$redis_key = 'ip';
$city = zRangeByscore($redis_key, $ip, '+inf', array('limit' => array(0, 1)));
if ($city) {
if (strpos($city[0], "#") === 0) {
echo '城市不存在!';
} else {
echo '城市是' . $city[0];
}
} else {
echo '城市不存在!';
}
}
网页/应用访问慢突然变慢,如何定位问题top、iostat查看cpu、内存及io占用情况
内核、程序参数设置不合理 查看有没有报内核错误,连接数用户打开文件数这些有没有达到上限等等
链路本身慢 是否跨运营商、用户上下行带宽不够、dns解析慢、服务器内网广播风暴什么的
程序设计不合理 是否程序本身算法设计太差,数据库语句太过复杂或者刚上线了什么功能引起的
其它关联的程序引起的 如果要访问数据库,检查一下是否数据库访问慢
是否被***了 查看服务器是否被DDos了等等
硬件故障 这个一般直接服务器就挂了,而不是访问慢
分析apache日志获取最多访问的前10个IPawk '{a[$1] += 1;} END {for (i in a) printf("%d %s\n", a[i], i);}' 日志文件 | sort -n | tail
首先用awk统计出来一个列表,然后用sort进行排序,最后用tail取最后的10个。
以上参数可以略作修改显示更多的数据,比如将tail加上-n参数等,另外日志格式不同命令也可能需要稍作修改。
当前WEB服务器中联接次数最多的ip地址
#netstat -ntu |awk '{print $5}' |sort | uniq -c| sort -nr
查看日志中访问次数最多的前10个IP
#cat access_log |cut -d ' ' -f 1 | sort |uniq -c | sort -nr | awk '{print $0 }' | head -n 10 | less
查看日志中出现100次以上的IP
#cat access_log |cut -d ' ' -f 1 | sort |uniq -c | awk '{if ($1 > 100) print $0}'|sort -nr | less
查看最近访问量最高的文件
#cat access_log | tail -10000 | awk '{print $7}' | sort | uniq -c | sort -nr | less
查看日志中访问超过100次的页面
#cat access_log | cut -d ' ' -f 7 | sort |uniq -c | awk '{if ($1 > 100) print $0}' | less
统计某url,一天的访问次数
#cat access_log | grep '12/Aug/2009' | grep '/images/index/e1.gif' | wc | awk '{print $1}'
前五天的访问次数最多的网页
#cat access_log | awk '{print $7}' | uniq -c | sort -n -r | head -20
从日志里查看该ip在干嘛
#cat access_log | grep 218.66.36.119 | awk '{print $1"\t"$7}' | sort | uniq -c | sort -nr | less
列出传输时间超过 30 秒的文件
#cat access_log | awk '($NF > 30){print $7}' | sort -n | uniq -c | sort -nr | head -20
列出最最耗时的页面(超过60秒的)
#cat access_log | awk '($NF > 60 && $7~/\.PHP/){print $7}' | sort -n | uniq -c | sort -nr | head -100
感谢
PHP技术大全https://zhuanlan.zhihu.com/PHPgod
3年PHPer的面试总结http://coffeePHP.com/articles/4
面试过阿里等互联网大公司,我知道了这些套路https://juejin.im/post/59bd64c4f265da066d33333d
前端面试题https://github.com/calabash519/intervIEw-questions
Laravel、PHPer 面试可能会遇到的问题https://github.com/todayqq/caseIntervIEwQuestions https://github.com/justCodingnobb/fuck-PHP-intervIEw https://zhuanlan.zhihu.com/p/2593665
https://www.v2ex.com/t/375266
总结
以上是内存溢出为你收集整理的PHP 面试题全部内容,希望文章能够帮你解决PHP 面试题所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)