依图科技算法工程化日常实习一面

时长大约1个小时

开头是自我介绍,然后和面试官聊了一下自己用的语言,还有自己是统计学专业的,所以科班知识比较少 上来是手撕一道代码:最长无重复子串,要求输出子串 一开始思路是:用左指针和右指针去定位现在检索的子串,如果右指针指的子串在字典中,就比较一下最长长度和左右指针的间距。 如果更长的话,就更新最长长度以及记录最长子串位置的start和end,再将左指针更新成重复字符在字典中的索引,右指针等于左指针,重置字典。 不在字典中的话,就把字符和索引放入字典,右指针移动一个位置。有个临界条件,当右指针到字符串最后的时候,还需要比较一下和最长长度的距离,然后更新。 我的基础一般,所以一开始想的是左指针每次动一次,然后写着写着发现可以直接挪到字典中的右指针位置,所以大概花了20分钟左右。 之后的话就是类似像智力题这样子 第一题是甲乙扔硬币,扔到正面获胜,甲先扔,获胜概率?这题秒回答了2/3。算是涉及到自己专业的概率论知识,比较简单,一个等比收敛求和就可以了。 第二题是1到100这些数,然后随机抽掉一个数,再打乱放入一个数组中,问怎么找到这个抽掉的数? 这个也算是秒回答,当时想着这题是不是要说算法,但是我自己脱口而出了5050减数组总和就可以了(从小刻在脑子里的5050)。然后反应过来这题面试官确实就是不想让我说代码的算法,要用数学知识回答。 第二题和第一题类似,然后抽掉两个数。一开始思路也是类似,知道x+y的总和,然后是求不定方程解就可以了,枚举检索一下。 面试官说还有没有更快的一点,我说快排然后直接找,他说这个复杂度比你上一个还要高。 之后就是说应该是还需要在找一个关于x、y的条件然后把他算出来,后来面试官提示了一下你第一题用的加法,是不是乘法也可以,然后就知道了可以直接累乘得出xy的值,解一元二次方程就行了。 最后就聊了一下自己的项目,还有关于如果入职以后的一些问题和对我的建议。 总体感觉面试官很好,但是自身能力上确实和科班有差距,之后加油吧。 上午刚刚面完,再等二面消息。 附上自己的代码(有更好的思路欢迎分享):
 1 def findstr(s):
 2     n = len(s)
 3     if n < 2:
 4         return s
 5     start = 0;end = 0
 6     lp = 0;rp = 0
 7     ans = 0
 8     dic = {}
 9     while rp < n:
10         if s[rp] in dic:
11             if rp - lp > ans:
12                 ans = max(ans, rp - lp)
13                 start = lp
14                 end = rp - 1
15             lp = dic[s[rp]] + 1
16             rp = lp
17             dic = {}
18         else:
19             dic[s[rp]] = rp
20             rp += 1
21         if rp == n - 1 and s[rp] not in dic and rp - lp + 1 > ans:
22             ans = max(ans, rp - lp + 1)
23             start = lp
24             end = rp
25     return s[start:end+1]

 

上一篇:《Axure RP 9实战指南》Axure RP 9.0在原型中使用页面说明


下一篇:【题解】ABC231G - Balls in Boxes & H - Minimum Coloring