先吐槽一下牛客网的面试系统,前两次面试都是考官不能听到我说话,结果后来发现是考官那边的问题,对于设备硬件的隐私设置这块并没有明显的提示说明。
一面:
第一次面试我先用手机登陆的面试房间,才能顺利沟通,然后答题是全用打字沟通的,唉
先自我介绍,后考了两道算法
第一道题给忘了
给一个数组一个目标值,求在该数组中,加和为目标值的两个数的所有数对的坐标,数组的元素不能重复使用
tar = 5
nums = [3, 5, 2, 6, 4, 8, 1]
def aaa(num):
ddict = {}
for i in range(0,len(num)):
n = num[i]
try:
a = ddict[n]
res.append([ddict[n][0],i])
except:
tmp = tar-n
ddict[tmp] = [i,n]
aaa(nums)
print(res)
二面:
第一题:
实现函数 unzip:
参数传入 返回
4d5e2d ddddeeeeedd
2x2c2v xxccvv
12x
这样的一道题,当时的代码:
test = '12x12c'
def unzip(x):
ints = {'1','2','3','4','5','6','7','8','9','0'}
res = ''
res_tmp = []
left = 0
for i in range(0,len(x)-1):
if (x[i] in ints and x[i+1] not in ints) or (x[i] not in ints and x[i+1] in ints):
res_tmp.append(x[left:i+1])
left = i+1
res_tmp.append(x[left:])
l = 0
print(res_tmp)
while l<len(res_tmp):
a_int = int(res_tmp[l])
a_str = res_tmp[l+1]
for j in range(a_int):
res = res+a_str
l += 2
return res
result = unzip(test)
print(result)
第二题:
一个升序数组,循环移动几位,得到新数组A,请设计一个查找算法,求k 是否 在 A中。
代码:
nums_ = [4,5,6,7,8,9,1,2]
tar_ = 5
def solusion(nums,tar):
if tar<nums[0] and tar>nums[-1]:
return False
if tar==nums[0] or tar==nums[-1]:
return True
left = 0
right = len(nums)-1
def get_start(left_,right_):
mid = int((left_+right_)/2)
num_mid = nums[mid]
if nums[mid]>nums[mid+1]:
return mid+1
elif nums[mid]>=nums[0]:#中点在最小值左侧
res = get_start(mid,right_)
elif nums[mid]<=nums[-1]:#中点在最小值右侧
res = get_start(left_,mid)
return res
start = get_start(left,right) # 最小值的位置
print(start,'-')
if tar>=nums[0]:
nums = nums[:start]
elif tar<=nums[-1]:
nums = nums[start:]
left = 0
right = len(nums)-1
def get_t_or_f(left_,right_):
if right_-left_==1:
if tar not in {nums[left_],nums[right_]}:
return False
mid = int((left_+right_)/2)
num_mid = nums[mid]
if num_mid==tar:
return True
else
final = get_t_or_f(left,right)
result = solusion(nums_,tar_)
print(result)
第三题:求一个字符串的最长回文子串
sstr = 'abcbcba'
def get_zchw(s):
res = s[0]
ss = '#'
for i in range(0,len(s)):
ss = ss+s[i]+'#'
for i in range(3,len(ss)-3):
if ss[i]=='#':
left,right = i-1,i+2
else:
left,right = i,i+1
n = 0
while n<=i:
if right-left<=len(res):
left -= 2
right += 2
n += 2
continue
tmp = ss[left:right]
if tmp==tmp[::-1]:
if len(tmp)>len(res):
res = tmp
left -= 2
right += 2
n += 2
if len(ss)-i<int(len(res)/2)+1:
break
result = res.replace('#','')
return result
ans = get_zchw(sstr)
print(ans)
三面:
这次面试时设备好了,顺利沟通。
开始自我介绍,然后聊了一些简历上的东西,后了解我在算法上的相关经历,确实在学校中的相关经历不足,更多的是在软件工程上面。
然后考了个题:
均匀硬币,
两人轮流抛
H,T
先抛到正面赢
先抛的人赢的概率
这类题真的不擅长,再加上在家用手机热点面试,途中断网两次,直接凉凉。
再吐槽一下人人网,二面约了两次,此一次我上线等了一个半小时,给hr发消息,好久回我抱歉刚才开会去了,不懂你开会跟面试官有啥关系呢,是面试官没有接到通知吗
当然实力不够说啥都像是在为自己辩解,就这样吧
很多都是凭记忆重写的,若有错误,恳请指出讨论