原创微信公众号:【小鸿星空科技】
版权声明:原创不易,本文禁止抄袭、转载,侵权必究!
一、Python(后端/服务端/算法/测试开发)
主观题:
- 自我介绍
- 项目介绍,会针对细节提问
- 你的优势在哪里?
- 你的不足之处是什么?
- 你有哪些爱好?
- 项目中遇到过哪些问题,是怎么解决的呢?
- 有其他公司的Offer吗?
- 举例说出你的平衡能力
- 最近在看什么书?
- 毕业时间?
- 为什么投我们公司?
- 形容下自己
- 职业规划
- 反问环节
数据库:
- 关系型数据库和非关系型数据库的区别?
- 数据库左连接、右连接、内连接、外连接的区别?
- 数据库中怎样进行约束?
- 复杂查询SQL语句以及跨表查询
- group by 和 order by 的区别?
- 何时建立索引?
- MySQL和Redis的区别?
- SQL中各数据类型占的字节是多少?
- redis是如何实现分布式和缓存的?
- 四大范式联系及区别?
- 数据库容中灾备份方案有哪些?
Linux:
- 你常用的Linux指令有哪些?
- 怎样一行找到进程的pid并杀死?
- 怎样查看日志?
- 怎样查看系统资源?
- 怎样找到指定的文件?
- 怎样找到指定的文件?
- 怎样查看IP地址?
计算机网络
- http原理,和https有什么区别?
- Get请求和Post请求的区别?
- session和cookies有哪些区别?
- TCP和UDP以及它们之间的区别
- 输入一个URL然后回车发生了什么?
- OSI和TCP/IP模型的区别,每一层有哪些协议?
- TCP和UDP的三次握手和四次挥手?如果只有二次握手会发生什么?只有三次挥手呢?
- https是如何实现安全可靠的加密传输的?
- 你知道哪些状态码?返回202,300,304,500,502,504代表什么?
数据结构:
- 数组和Python中列表的区别?
- Python中列表和元组、字符串、集合、字典的区别?
- Python浅拷贝和深拷贝的区别?
- Python 迭代器+生成器+装饰器?
- Python中 **args和 **kwargs的区别?
- 满二叉树和完全二叉树的区别?
- 数组和链表的区别?
- Python是如何实现哈希表/散列表/映射的?
测试开发:
- 你自己对测试的理解/为什么要做测试?
- 如何对一个Web页面进行测试?
- 测试用例:测试用户账号密码登录、微信朋友间发送图片、电商平台优惠券
- 用过哪些抓包测试工具?你对自己写的代码是如何进行测试的?
- 软件测试流程?
- 黑盒、白盒测试有哪些方法?区别是什么?
操作系统和其他问题:
- 面向对象的特征有哪些?
- 进程和线程的区别有哪些?
- 多进程和多线程的优点和缺点?
- 你使用过的Python第三方库有哪些?用在什么场景下?
- 事务的特性有哪些?
- 死锁是如何产生的,怎样解决?
- Python是如何进行内存管理的?
- GIL/如何避免受到GIL的影响?
- 毕业设计
- Git/Svn指令
- 有哪些方式可以实现多线程?
- 用过哪些框架?在哪些情况下用到过?
- dos攻击是如何实现的?
- 你对线程池了解多少?
算法题:
1.输出一个字符串中不重复最长连续子串的长度(比如:输入参数为字符串s = ‘abca’,输出为整型数字3)
#滑动窗口+哈希表
class Solution:
def maxLenSub(self, astring: str) -> int:
Dict, left, max_len = {
}, 0, 0
for i, s in enumerate(astring):
if s in Dict:
left = max(left, Dict[s] + 1)
Dict[s] = i
max_len = max(max_len, i - left + 1)
return max_len
2.合并两个有序数组(比如:arr1 = [1,2,3],arr2 = [7,8,9],合并后返回为[1,2,3,7,8,9])
#双指针
class Solution:
def mergeSortedArr2(self, arr1: List[int], arr2: List[int]) -> List[int]:
temp_list, i, j = [], 0, 0
while arr1 and arr2:
if arr1[i] < arr2[j]:
temp_list.append(arr1.pop(i))
else:
temp_list.append(arr2.pop(j))
return temp_list + arr1 + arr2
3.合并两个有序链表(意思同上)
class ListNode:
def __init__(self,val=0, next=None):
self.val = val
self.next = next
class Solution:
def mergeSortedL2(self, L1: ListNode, L2: ListNode) -> ListNode:
if L1 is None:
reurn L2
elif L2 is None:
return L1
elif L1.val < L2.val:
L1.next = self.mergeSortedL2(L1.next, L2)
return L1
else:
L2.next = self.mergeSortedL2(L1, L2.next)
return L2
4.一个数组中最大连续子数组之和(比如:arr = [3,4,-2,-8,0,2],则输出为7)
class Solution:
def maxSumSub(self, arr: List[int]) -> int:
max_sum = arr[0]
pre_sum = 0
for i in arr:
if pre_sum < 0:
pre_sum = i
else:
pre_sum += i
if pre_sum > max_sum:
max_sum = pre_sum
return max_sum
5.整数反转(比如:输入参数为num = 123,输出参数为num = 321,120变为21,-123变为-321,注意越界情况)
def reverseInt(num):
# 整数反转
INT_MIN, INT_MAX = -2**31, 2**31 - 1
total, negative_num = 0, False
if num < 0:
num = abs(num)
negative_num = True
while num != 0:
if total < INT_MIN // 10 + 1 or total > INT_MAX // 10:
return 0
mod = num % 10
num = num // 10
total = total*10 + mod
if negative_num is True:
total = int('-' + str(total))
return total
6.快排和冒泡
class Solution:
def quickSort(self, arr: List[int]) -> List[int]:
if len(arr) < 2:
return arr
else:
pivot = arr[0]
less = [i for i in arr[1:] if i <= pivot]
greater = [i for i in arr[1:] if i > pivot]
return self.quickSort(less) + [pivot] + self.quickSort(greater)
def maopaoSort(self, arr: List[int]) -> List[int]:
# while+for循环
times = len(arr) - 1
while times > 0:
for i in range(times):
if arr[i] > arr[i+1]:
arr[i], arr[i+1] = arr[i+1], arr[i]
times -= 1
return arr
# 两个for循环
# for i in range(1, len(arr)):
# for j in range(len(arr) - i):
# if arr[j] > arr[j+1]:
# arr[j], arr[j+1] = arr[j+1], arr[j]
# return arr
7.完全二叉树的节点个数
class Solution:
def countNodes(self, root):
return 0 is root is None else self.countNodes(root.left) + self.countNodes(root.right) + 1
8.螺旋矩阵
class Solution(object):
"""
螺旋矩阵
"""
def spiralOrder(self, matrix):
"""
:params matrix: 二维数组
"""
if matrix is None or len(matrix) == 0:
return matrix
else:
m, n = len(matrix), len(matrix[0])
return self.get_spiralOrder(matrix, 0, m - 1, 0, n - 1)
def get_spiralOrder(self, matrix, r_start, r_end, c_start, c_end):
if r_start > r_end or c_start > c_end:
return []
elif r_start == r_end:
return matrix[r_start][c_start:c_end + 1]
elif c_start == c_end:
return [matrix[i][c_end] for i in range(r_start, r_end + 1)]
else:
curr = matrix[r_start][c_start:c_end + 1] + [matrix[i][c_end] for i in range(r_start + 1, r_end)] + \
matrix[r_end][c_start:c_end + 1][::-1] + [matrix[i][c_start] for i in reversed(range(r_start + 1, r_end))]
res = curr + self.get_spiralOrder(matrix, r_start + 1, r_end - 1, c_start + 1, c_end - 1)
return res
9.反转链表
class Solution:
def reverse(self, head: ListNode):
pre = None
curr = head
while curr is not None:
curr.next = pre
pre = curr
curr = curr.next
return pre
10.N叉树的前序遍历和后序遍历
class Node:
def __init__(self, val=None, children=None):
self.val = val
self.children = children
# N叉树的前序遍历
def preOrder(self, root: Node):
ans = []
def dfs(node: Node):
if node is None:
return node
ans.append(node.val)
for ch in node.children:
dfs(ch)
dfs(root)
return ans
# N叉树的后序遍历
def postOrder(self, root: Node):
ans = []
def dfs(node: Node):
if node is Node:
return node
for ch in node.children:
dfs(ch)
ans.append(node.val)
dfs(root)
return ans
11.最长有效括号长度
class Solution:
def longestValidParentheses(self, s: str) -> int:
if not s:
return 0
res = []
stack = []
for i in range(len(s)):
if stack and s[i] == ")":
res.append(stack.pop())
res.append(i)
if s[i] == "(":
stack.append(i)
res.sort()
#print(res)
i = 0
ans = 0
n = len(res)
while i < n:
j = i
while j < n - 1 and res[j + 1] == res[j] + 1:
j += 1
ans = max(ans, j - i + 1)
i = j + 1
return ans
12.输出字符串中每个字符出现次数
class Solution:
def stringCount1(self, astring: str) -> dict:
return {
i:astring.count(i) for i in astring}
def stringCount2(self, astring: str) -> dict:
Dict = {
}
for s in astring:
Dict[s] = Dict[s] + 1 if s in Dict else 1
return Dict
13.数组中的最大和最小值交换位置,其他元素的位置不变(比如arr = [1,89,56,45,23],输出为[89,1,56,45,23])
class Solution:
def swapOfArr(self, arr):
def Biggest(arr):
biggest = arr[0]
biggest_index = 0
for i in range(len(arr)):
if arr[i] > biggest:
biggest = arr[i]
biggest_index = i
return biggest_index
def Smallest(arr):
smallest = arr[0]
smallest_index = 0
for i in range(len(arr)):
if arr[i] < smallest:
smallest = arr[i]
smallest_index = i
return smallest_index
biggest_index = Biggest(arr)
smallest_index = Smallest(arr)
arr[biggest_index], arr[smallest_index] = arr[smallest_index], arr[biggest_index]
return arr
14.两个栈实现一个队列
class Queue:
# 两个栈实现一个队列
def __init__(self):
self.A, self.B = [], []
def appendTail(self, value: int) -> None:
self.A.append(value)
def deleteHead(self) -> int:
if self.B: return self.B.pop()
if not self.A: return -1
while self.A:
self.B.append(self.A.pop())
return self.B.pop()
15.最长递增子数组长度(比如:arr = [2,-1,5,8,-3,9],输出为4)
class Solution:
# 最长递增子数组长度
def lengthOfLIS(self, nums: list) -> int:
if not nums:
return 0
dp = []
for i in range(len(nums)):
dp.append(1)
for j in range(i):
if nums[i] > nums[j]:
dp[i] = max(dp[i], dp[j] + 1)
return max(dp)
16.字符串的翻转(比如输入参数为字符串s = 'abcd', k = 2,则输出参数为字符串'bacd')
class Solution:
def reverseStr1(self, s: str, k: int) -> str:
str_arr = [i for i in s]
for i in range(0, len(str_arr), 2*k):
str_arr[i:i+k] = str_arr[i:i+k][::-1]
return ''.join(str_arr)
def reverseStr2(self, s: str, k: int) -> str:
i, newStr = 0, ''
while i < len(s):
newStr += s[i:i+k][::-1] + s[i+k:i+2*k]
i += 2*k
return newStr
二、Java(后端/服务端/算法/测试开发)
主观题:
- 同上
数据库:
- Java在数据库中如何保证原子性?
- 其他同上
计算机网络:
- 同上
数据结构:
- StringBuilder和StringBuffer有哪些区别?
- HashMap的底层实现原理?
- Java中i++和++i的区别?
- Java中wait和sleep的区别是什么?
- JVM原理实现?
- B+数索引是如何实现的?
- integer和int的区别?
- ArrayList继承或者实现了什么?
- Java中的垃圾回收机制?
操作系统和其他问题:
- Java中如何开启多个线程
- Java是如何进行上锁的?有哪些区别?
- spring有哪些实现模块?
- Java是如何实现反射的以及原理?
- 阻塞IO和非阻塞IO?
- Ajax的实现原理是什么?
- Java和JS编译原理区别有哪些?
- 你知道哪些设计模式?
- 中断和陷入是什么?
- spring中Ioc和Aop概念?
- 简单工厂和抽象工厂有什么区别?
- 单例模式的手写?
- 乐观锁和悲观索?
- Java中重载和重写区别?
- 虚函数实现原理?
- 指针和引用的区别有哪些?
算法题:
- 同上
三、原文链接
四、作者Info
作者:小鸿的摸鱼日常,Goal:让编程更有趣!
原创微信公众号:『小鸿星空科技』,专注于校招(内推/笔经/面经)、算法、爬虫,网站,游戏开发,数据分析、自然语言处理,AI等,期待你的关注,让我们一起成长、一起Coding!
版权说明:本文禁止抄袭、转载 ,侵权必究!