面试快结尾了突然来个手写算法题,结果没写出来。 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
Exsole
V2EX    程序员

面试快结尾了突然来个手写算法题,结果没写出来。

  •  
  •   Exsole 2023-04-18 09:25:38 +08:00 8896 次点击
    这是一个创建于 954 天前的主题,其中的信息可能已经有所发展或是发生改变。

    昨天,远程视频面试。

    感觉前面的问题回答得挺好的,突然发了个网址,让我在线写代码。

    一个全排列的算法,事后我查了是 leetcode 第 46 道原题,中等难度。

    https://leetcode.cn/problems/permutations/

    拿到题,最开始想直接数组遍历,逐步迭代,当前全排列基于上一个排列插入新数字的生成新的结果。

    结果磕磕绊绊,没写出完整。面试官最后让我说下思路。。。

    唉,郁闷了一晚上没睡着。

    41 条回复    2023-04-20 09:10:39 +08:00
    CQdake
        1
    CQdake  
       2023-04-18 09:29:01 +08:00
    1 、思路讲明白大概就可以了,说不定其他面试者连面试的问题都回答不上呢,到时候工作还是你的。
    exmario
        2
    exmario  
       2023-04-18 09:43:37 +08:00
    +1 ,本来就是考思路,谁还能直接手写代码一遍过啊
    aLazarus
        3
    aLazarus  
       2023-04-18 09:45:30 +08:00
    如果没思路的话,可以试一下申请换题
    Exsole
        4
    Exsole  
    OP
       2023-04-18 09:47:41 +08:00
    @aLazarus #3 还可以这么要求。。 第一次听说。
    poemcorner
        5
    poemcorner  
       2023-04-18 09:50:02 +08:00
    不想再郁闷一晚上就把 hot100 刷五六遍
    leon0918
        6
    leon0918  
       2023-04-18 09:56:35 +08:00
    如果前面回答的挺好的,这种情况也有机会过
    dogfight
        7
    dogfight  
       2023-04-18 09:58:05 +08:00
    chatgpt
    Exsole
        8
    Exsole  
    OP
       2023-04-18 10:02:41 +08:00
    @dogfight #7
    chatGPT 回答面试八股文,解算法题,都比人类强。
    面试的时候,遇到一些问题,我真想直接回答:“ 这种问题问下 chatGPT ,它的答案更好 ”。
    Nazz
        9
    Nazz  
       2023-04-18 10:11:18 +08:00
    DFS 可解, 虽然效率不高, 但 leetcode 不卡时间
    Erroad
        10
    Erroad  
       2023-04-18 10:14:58 +08:00
    说考思路的认真的?这种 hot100 还是回溯模板题,我面的几家答不出都是挂啊
    Biggoldfish
        11
    Biggoldfish  
       2023-04-18 10:18:57 +08:00 via Android
    考思路的认真的+1

    这种常见题不准备也该一遍秒啊,再说有思路写成代码才多久
    emSaVya
        12
    emSaVya  
       2023-04-18 10:25:07 +08:00
    出这种题说明是真的想要你的。没 ac 可惜了。
    bigxianyu
        13
    bigxianyu  
       2023-04-18 10:35:05 +08:00
    backing , 不过有一些公司思路更重要,实现不是全部
    Brunuh2Ville2
        14
    Brunuh2Ville2  
       2023-04-18 10:36:44 +08:00
    楼主郁闷的应该是"简单题"没写出来,有相当大的机会然而没把握住。换成难题你就不会郁闷了。
    iOCZ
        15
    iOCZ  
       2023-04-18 10:41:30 +08:00
    一般就 DFS 啥的
    dswyzx
        16
    dswyzx  
       2023-04-18 10:47:22 +08:00 via iPhone
    这题还真得 dfs ,还有个变种是数组有相同数字哎,只能说面试官有点找事吧
    Litccc
        17
    Litccc  
       2023-04-18 11:12:49 +08:00
    回溯模板题,现在面试基本都要考算法题的,楼主多刷刷吧
    Nazz
        18
    Nazz  
       2023-04-18 11:14:27 +08:00
    DFS 也能写得非常高效, 0ms AC
    https://leetcode.cn/submissions/detail/425576450/
    AmericanExpress
        19
    AmericanExpress  
       2023-04-18 11:21:46 +08:00
    这种题只要求讲思路过分了吧
    至少要写出能过基本 test case 的代码
    chenshun00
        20
    chenshun00  
       2023-04-18 11:28:32 +08:00
    @emSaVya 这么说的话,不来两数之和嘛
    optional
        21
    optional  
       2023-04-18 11:29:52 +08:00 via iPhone
    感觉是放水题
    coyoteer
        22
    coyoteer  
       2023-04-18 11:41:46 +08:00
    全排列 dfs 最简单啦
    hankai17
        23
    hankai17  
       2023-04-18 12:01:17 +08:00
    不刷题的话 应该不好想
    如果前面答得好 也没什么
    baislsl
        24
    baislsl  
       2023-04-18 12:42:50 +08:00
    @Nazz DFS 不重不漏, 已经是最优解法了
    k9982874
        25
    k9982874  
       2023-04-18 12:50:51 +08:00
    直接递归完事
    dudubaba
        26
    dudubaba  
       2023-04-18 12:52:27 +08:00
    不刷题在面试这种几分钟的紧张氛围里没几人写的出来。
    ccagml
        27
    ccagml  
       2023-04-18 13:33:49 +08:00 via Android
    可惜了,不是出 hard 感觉就是要你了
    JasonLaw
        28
    JasonLaw  
       2023-04-18 14:11:20 +08:00


    ```python
    class Solution:
    def permute(self, nums: List[int]) -> List[List[int]]:
    def gen_permutations(nums) -> List[List[int]]:
    if len(nums) == 1:
    return [nums]
    permutatiOns= []
    for i in range(len(nums)):
    for p in gen_permutations(nums[0:i] + nums[i + 1:]):
    permutations.append([nums[i]] + p)
    return permutations

    res = gen_permutations(nums)
    return res
    ```
    laowudxf
        30
    laowudxf  
       2023-04-18 14:19:28 +08:00
    没刷过力扣,想了三分钟有了思路,感觉不是很难。
    Tompes
        31
    Tompes  
       2023-04-18 14:27:02 +08:00
    全排列属于很常规的题了,出这题应该也是想让你过的
    reducm
        32
    reducm  
       2023-04-18 14:49:21 +08:00
    LeetCode 46 题的题目描述为:给定一个不含重复数字的数组 nums ,返回其所有可能的全排列。你可以按任意顺序返回答案。

    解题思路:

    该题可以使用回溯算法来解决,回溯算法解决的问题都可以抽象成树结构,每个节点表示一个状态,每个节点的子节点表示在该状态下可以转移到的所有状态。

    在本题中,我们可以将每个元素看作一个节点,然后每个节点的子节点是剩下的元素,表示选择了该元素后可以继续选择哪些元素。因此,我们可以使用回溯算法来遍历这棵树,找到所有的解。

    具体实现时,我们可以使用一个数组来保存当前选择的元素,使用一个布尔数组来标记每个元素是否已经被选择过,然后按照如下步骤进行回溯:

    如果选择的元素数量等于原始数组的长度,说明已经选择了所有元素,将当前选择的元素列表加入最终结果中。

    遍历原始数组,对于每个未被选择过的元素,将其加入选择列表中,并将其标记为已选择,然后递归进入下一层。

    回溯时,将选择列表中最后一个元素删除,并将其标记为未选择。

    重复上述步骤,直到遍历完所有状态。

    Java 代码实现:

    class Solution {
    public List<List<Integer>> permute(int[] nums) {
    List<List<Integer>> res = new ArrayList<>();
    boolean[] used = new boolean[nums.length];
    backtrack(nums, new ArrayList<>(), used, res);
    return res;
    }

    private void backtrack(int[] nums, List<Integer> temp, boolean[] used, List<List<Integer>> res) {
    if (temp.size() == nums.length) {
    res.add(new ArrayList<>(temp));
    return;
    }
    for (int i = 0; i < nums.length; i++) {
    if (!used[i]) {
    temp.add(nums[i]);
    used[i] = true;
    backtrack(nums, temp, used, res);
    used[i] = false;
    temp.remove(temp.size() - 1);
    }
    }
    }
    }

    时间复杂度:O(n×n!),其中 n 表示数组的长度,n! 表示全排列的总数,因为每个全排列包含 n 个元素,因此总共需要枚举 n×n! 个状态。

    空间复杂度:O(n),其中 n 表示数组的长度,空间复杂度取决于递归调用栈的深度和存储当前选择的元素的列表。在最坏情况下,递归调用栈的深度为 n ,因此空间复杂度为 O(n)。
    mqtdut1
        33
    mqtdut1  
       2023-04-18 16:01:26 +08:00
    一看就是递归
    再看一下,数组长度 1-6 ,那就换总写法吧
    写 6 个 if ,2 写 2 层 for ,3 写 3 层 for
    https://leetcode.cn/submissions/detail/425663532/
    Nazz
        34
    Nazz  
       2023-04-18 16:22:20 +08:00
    @mqtdut1 简单粗暴
    gitignore
        35
    gitignore  
       2023-04-18 16:31:54 +08:00
    递归咯,每个数插在前一个全排列的缝隙里

    [0, 1] => [ [ 0, 1 ], [ 1, 0 ] ]

    [0 , 1, 2] 相当于在上面每个数组的每个缝隙插入 2:

    [0, 1] 插入 2 得到 [2, 0, 1], [0, 2, 1], [0, 1, 2]
    [1, 0] 插入 2 得到 [2, 1, 0], [1, 2, 0], [1, 0, 2]
    Exsole
        36
    Exsole  
    OP
       2023-04-18 16:34:14 +08:00
    @gitignore #35
    我就是这么思考的。 结果写着写着卡壳了。
    kjstart
        37
    kjstart  
       2023-04-18 21:38:40 +08:00
    全排列一般用回溯, 找几个经典的题解把常见算法看看就可以了. 从第一位开始全试一遍, 下一层去掉正在使用的数字, 重复上面的步骤.
    littleBink
        38
    littleBink  
       2023-04-19 01:09:46 +08:00
    我最后面试官给了一道签到题:tom is a cat 倒序输出 cat is a tom 。一看题目以为面试官这是送我 offer ,结果折腾了五分钟,差点没写出来,总是有小细节遗漏了
    WashFreshFresh
        39
    WashFreshFresh  
       2023-04-19 09:37:02 +08:00
    @grahamsa0503 好久没刷题确实不熟练,像这个就是有好几种解法。
    JasonLaw
        40
    JasonLaw  
       2023-04-20 09:04:24 +08:00
    littleBink
        41
    littleBink  
       2023-04-20 09:10:39 +08:00 via iPhone
    @JasonLaw 谢谢。面试官不让用 api ,需要全部自己实现。我思路基本上是清楚的,就是实现的时候有些细节总是疏忽
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     4321 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 33ms UTC 01:03 PVG 09:03 LAX 17:03 JFK 20:03
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86