实际参与的某公司面试,总结了遇到的值得整理记录的面试题。
目录
相对路径
正序判断
倒序判断
输出部门负责人及下级
代码实现
最终效果
科目平均分
SQL筛选
代码实现
分组错误
原因
查看版本
确认模式
设置模式
相遇洞穴
代码实现
方式一:
方式二:
PHP7默认支持特性
MySQL蠕虫复制sql语句
总结
相对路径
两个文件路径 a=”/a/b/11/22/a.php” b=”/a/b/33/44.b.php”
输出b到a的相对路径为:../../11/22/a.php
有两种算法,只是顺序不同。
正序判断
示例如下:
function getPath($a, $b)
{
if (empty($a) || empty($b)) return "";
$path = $a;
$path1 = explode('/', $a);
$path2 = explode('/', $b);
for ($i = 0; $i < count($path1); $i++) {
if ($path1[$i] == $path2[$i]) {
$path = str_replace($path1[$i].'/', '../', $path);
} else {
break;
}
}
return $path;
}
print_r(getPath($a, $b));
倒序判断
示例如下:
function getPath2($a, $b)
{
if (empty($a) || empty($b)) return "";
$path1 = explode('/', $a);
$path2 = explode('/', $b);
$num = count($path1);
$path_prefix = '';
$path_end = '';
for ($i = ($num - 1); $i >= 0; $i--) {
if ($path1[$i] != $path2[$i]) {
$path_end = $path1[$i] . '/' . $path_end;
} else {
$path_prefix .= '../';
}
}
return $path_prefix . rtrim($path_end, '/');
}
print_r(getPath2($a, $b));
输出部门负责人及下级
部门分级列表 输出每个下级包括间接下级。
$arr = ['张三' => [
'王五' => ['王六' => '王七'],
'赵六' => null
], '李四' => [
'李一' => null,
'李二' => ['李三' => '李武']
]
];
输出格式:
张三:王五,王六,王七,赵六
王五:王五六,王五七
赵六:
代码实现
function getLevel($arr)
{
// 获取所有下级人员名称
function getSubNames($arr)
{
$tmp = [];
foreach ($arr as $k => $v) {
$tmp[] = $k;
if (is_array($v)) {
$tmp[] = getSubNames($v);
} else {
if ($v) $tmp[] = $v;
}
}
return implode(',', $tmp);
}
// 把所有部门从下级中拎出来 重组数组
function mergeArr($arr)
{
$data = [];
foreach ($arr as $k => $v) {
$data[$k] = $v;
if (is_array($v)) {
$data = array_merge($data, mergeArr($v));
}
}
return $data;
}
$res = [];
$data = mergeArr($arr);
foreach ($data as $k => $v) {
if (is_array($v)) {
$str = getSubNames($v);
} else {
$str = $v;
}
$res[] = $k . ':' . $str;
}
return $res;
}
print_r(getLevel($arr));
最终效果
科目平均分
学生报考多科目 每个科目可以报考多次 以最高成绩记为有效成绩
计算每个科目有效成绩的平均分
SQL筛选
SELECT name, type, score FROM `kemu` group by name,type order by score desc;
结果:
分别取每个科目,每个学生的最高分,总数据条数10条,分组后为9条。
代码实现
统计总分和各科目报考人数计算科目平均分。
代码如下:
$arr = [
['name' => '小红', 'type' => '语文', 'score' => 100],
['name' => '小明', 'type' => '语文', 'score' => 99],
['name' => '小红', 'type' => '英语', 'score' => 90],
['name' => '小刚', 'type' => '语文', 'score' => 90],
['name' => '小红', 'type' => '数学', 'score' => 89],
['name' => '小明', 'type' => '数学', 'score' => 88],
['name' => '小刚', 'type' => '数学', 'score' => 88],
['name' => '小刚', 'type' => '英语', 'score' => 88],
['name' => '小明', 'type' => '英语', 'score' => 79],
];
// 查询得到的数组
function getAvg($arr)
{
$res = [];
foreach ($arr as $v) {
$res[$v['type']][] = $v['score'];
}
foreach ($res as $k => $r) {
echo $k . '平均分:' . number_format(array_sum($r) / count($r), 2);
echo '<br/>';
}
}
getAvg($arr);
运行结果:
语文平均分:96.33
英语平均分:85.67
数学平均分:88.33
分组错误
MySQL报错1055 - Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'test.kemu.score' which is not functionally dependent on columns in GROUP BY clause
原因
Mysql版本问题
①在mysql5.7以上的版本中,对于 group by 的这种聚合操作,如果在select 中的列,没有在group by 中出现,那么这个SQL是不合法的,因为列不在group by的从句中,所以对于设置了这个mode的数据库,在使用group by 的时候,就要用MAX(),SUM(),ANT_VALUE()的这种聚合函数,才能完成GROUP BY 的聚合操作。
②在MySQL数据库版本为5.7以上的版本,默认开启了 ONLY_FULL_GROUP_BY SQL模式,在此模式下,对于group by操作,如果在select语句中的查询列没有在group by中出现,那么这个SQL就是非法的,因为列不在group by语句中,所以设置了sql_mode=only_full_group_by的数据库,在使用group by时就会报错。
查看版本
-- 查询mysql版本命令一:5.7.30
select version() from dual;
-- 查询mysql版本命令二:5.7.30
select @@version
确认模式
-- 查看mysql默认的模式方式一:
SELECT @@GLOBAL.sql_mode;
-- 查看mysql默认的模式方式二:
SELECT @@SESSION.sql_mode;
设置模式
去除 ONLY_FULL_GROUP_BY模式,重新设置值。
set @@global.sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
set @@SESSION.sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
之后分组sql可以运行了。
相遇洞穴
兔子和狼沿着环形山洞前进,兔子每天l个山洞,狼每天k个山洞,
问兔子和狼几天后相遇同一个山洞?
代码实现
方式一:
function getDayNum($n, $l, $k)
{
$tu = $l;
$lang = $k;
$day = 1;
while (true) {
if ($tu == $lang) {
break;
}
$tu += $l;
$lang += $k;
if ($tu >= $n) {
$tu -= $n;
}
if ($lang >= $n) {
$lang -= $n;
}
$day++;
}
return $day;
}
echo "<br/>";
echo getDayNum(10, 2, 5);
方式二:
function getDayNumV2($n, $l, $k)
{
$tu = $l;
$lang = $k;
$day = 1;
while (true) {
if (($tu + $lang) % $n == 0) {
break;
}
$tu += $l;
$lang += $k;
$day++;
}
return $day;
}
echo getDayNumV2(10, 2, 5);
运行结果:
10
PHP7默认支持特性
标量类型声明
返回类型声明
空合并运算符
匿名类
生成器
异步异常处理
MySQL蠕虫复制sql语句
insert into table_back (name,course,score) select name,course,score from tableName;
总结
总结了面试遇到的值得整理记录的面试题。