面试筛选问题
- 给你四个坐标点,如何判断它们能不能组成一个矩形?如判断([0,0],[0,1],[1,1],[1,0])能组成一个矩形
答:
//获取两个点之间的长度的平方
//不计算边长是为了后面方便进行比较
function getLength($point1, $point2){
$res = pow($point1[0]-$point2[0], 2) + pow($point1[1]-$point2[1], 2);
return $res;
}
function isRectangle($point1, $point2, $point3, $point4){
//任意两点相同 不可能组成矩形
if($point1 == $point2 || $point1 == $point3 || $point1 == $point4 || $point2 == $point3 || $point2 == $point4 || $point3 == $point4){
return false;
}
//将所有边长平方放在一个数组内
$arr = [];
$arr[] = getLength($point1, $point2);
$arr[] = getLength($point1, $point3);
$arr[] = getLength($point1, $point4);
$arr[] = getLength($point2, $point3);
$arr[] = getLength($point2, $point4);
$arr[] = getLength($point3, $point4);
//去重
$arr = array_unique($arr);
$arr_count = count($arr);
//正方形也是矩形
if($arr_count == 3 || $arr_count == 2){
$max_length = max($arr);
$min_length = min($arr);
$other_length = array_diff($arr, [$max_length, $min_length]);
//勾股定理
if($min_length + $other_length = $max_length){
return true;
} else {
return false;
}
} else {
return false;
}
}
调用
var_dump(isRectangle([0,0],[0,1],[1,1],[1,0]));
2、 下面代码结果是?
$a=array(‘1′,’2′,’3’);
$b=&$a;
$a=array(‘a’,’b’,’c’);
print_r($a);
print_r($b);
答:
Array
(
[0] => a
[1] => b
[2] => c
)
Array
(
[0] => a
[1] => b
[2] => c
)
3、mySQL 里有 2000w 数据,redis 中只存 20w 的数据,如何保证 redis 中的数据都是热点数据?
答:(1).保留热点数据
(2).保证redis只存入20w的数据。
首先热点数据就是频繁访问的数据,我们可以通过redis的淘汰策略来完成,这里推荐Allkeys-lru淘汰策略,该淘汰策略从数据集中挑选最近最少使用的数据删除。
再者需要解决的问题是只存入20w的数据,目前来看只能通过redis的内存限制来实现,计算20w数据使用内存大小进行预设置内存大小实现。或许内存大小不好计算,但是我们可以只记录热点数据的主键id,redis只保存热点数据主键id,而主键id一般都是定长的,大小利于计算。
4、禁用cookie后怎么使用session。请结合你做过的项目对上面的每一点进行举例剖析
答:Session URL重写,保证在客户端禁用或不支持COOKIE时,仍然可以使用Session。
如:
<?php session_start();
$_SESSION[‘url’] = ‘http://www.ailiaw.top’;
echo ‘个页面取到的session值:’.$_SESSION[‘url’];
?>
<a href=”session_a.php?<?php print session_name() ?>=<?php print session_id() ?>”>另一个页面</a>