面试题整理1

实际参与的某公司面试,总结了遇到的值得整理记录的面试题。

目录

相对路径

正序判断

倒序判断

输出部门负责人及下级

代码实现

最终效果

科目平均分

SQL筛选

代码实现

分组错误

原因

查看版本

确认模式

设置模式

相遇洞穴

代码实现

方式一:

方式二:

PHP7默认支持特性

MySQL蠕虫复制sql语句

总结


相对路径

两个文件路径 a="/a/b/11/22/a.php" b="/a/b/33/44.b.php"

输出b到a的相对路径为:../../11/22/a.php

有两种算法,只是顺序不同。

正序判断

示例如下:

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));

倒序判断

示例如下:

php 复制代码
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));

输出部门负责人及下级

部门分级列表 输出每个下级包括间接下级。

php 复制代码
$arr = ['张三' => [
    '王五' => ['王六' => '王七'],
    '赵六' => null
], '李四' => [
    '李一' => null,
    '李二' => ['李三' => '李武']
]
];

输出格式:

张三:王五,王六,王七,赵六

王五:王五六,王五七

赵六:

代码实现

php 复制代码
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筛选

sql 复制代码
SELECT name, type, score FROM `kemu` group by name,type order by score desc;

结果:

分别取每个科目,每个学生的最高分,总数据条数10条,分组后为9条。

代码实现

统计总分和各科目报考人数计算科目平均分。

代码如下:

php 复制代码
$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

分组错误

bash 复制代码
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

sql 复制代码
select version() from dual;

-- 查询mysql版本命令二:5.7.30

sql 复制代码
select @@version
确认模式

-- 查看mysql默认的模式方式一:

sql 复制代码
SELECT @@GLOBAL.sql_mode;

-- 查看mysql默认的模式方式二:

sql 复制代码
SELECT @@SESSION.sql_mode;
设置模式

去除 ONLY_FULL_GROUP_BY模式,重新设置值。

sql 复制代码
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个山洞,

问兔子和狼几天后相遇同一个山洞?

代码实现

方式一:
php 复制代码
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);
方式二:
php 复制代码
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);

运行结果:

bash 复制代码
10

PHP7默认支持特性

标量类型声明

返回类型声明

空合并运算符

匿名类

生成器

异步异常处理

MySQL蠕虫复制sql语句

sql 复制代码
insert into table_back (name,course,score) select name,course,score from tableName;

总结

总结了面试遇到的值得整理记录的面试题。

相关推荐
IT·小灰灰1 分钟前
Python——自动化发送邮件
运维·网络·后端·python·自动化
颜淡慕潇30 分钟前
【K8S系列】Kubernetes 中 Service IP 分配 问题及解决方案【已解决】
后端·云原生·容器·kubernetes
ac-er88881 小时前
PHP的 CSRF、XSS 攻击和防范
php·xss·csrf
秋恬意1 小时前
LinkedList 源码分析
java·开发语言·面试
恬淡虚无真气从之1 小时前
django中的类属性和类方法
后端·python·django
liuxin334455662 小时前
SpringBoot助力大型商场应急预案自动化
spring boot·后端·自动化
cuiyaonan20003 小时前
SpringBoot 下的Excel文件损坏与内容乱码问题
spring boot·后端·excel
Xvens3 小时前
thinkphp6 redis 哈希存储方式以及操作函数(笔记)
redis·php·哈希算法
0x派大星4 小时前
Golang 并发编程入门:Goroutine 简介与基础用法
开发语言·后端·golang·go·goroutine