2021届秋招正如火如荼地进行着,截止目前,我已经参加了绝大部分互联网企业的秋招,我想将自己写过的代码保存一下,供以后再来回味。
代码基本都是用Python写的,有些并没有100%AC。
不匹配括号数量
Input: 包含若干
(
,)
,[
,]
的字符串。
Output: 不能配对的括号的数量。
代码
1 |
def BracketsMatch(text, flag): |
分析
针对任意一对括号,可以用栈来存储无法匹配的括号。同时这种写法可以拓展到其他需要前后配对的字符上,例如{
和}
或者『
和』
等。
前m个值最大选项的序号
Input: 第一行n和m,n代表有几个物品,m代表取价值前m大;以后n行输入n个物品的重量和体积。
Output: 从小到大输出价值前m大的物品编号。
*物品价值 = 重量 + 2 × 体积
代码
1 |
line1 = input().split(' ') |
分析
类似于Excel之中排序,主排序标准和次排序标准。
0/1背包
0/1背包作为经典的动态规划问题,经常考察,但是只要掌握状态转移方程,动态规划基本上很少的代码就可以写出来。
代码
1 |
def Package(W, V, max_w): |
根据输入操作数字串
Input: 一行n和m,代表长度为n的值为下标的数字串;m行不同的操作。(1:将串首元素移动到最尾;2:交换第“2 × i + 1”和第“2 × i + 2”号元素,其中i从1开始。)
Output: 操作结束的数字串
代码
1 |
line1 = input().split(' ') |
分析
这种题目就是按照题目要求,写出不同操作的函数,然后调用就OK啦。在今年的秋招中,出现过很多次类似的题目,虽然操作不尽相同。
计算面积
求y = 0, x = C, x = D 与y = Ax^2 + x + B相交区域的面积。
Input: A,B,C和D。
Output: 面积(保留6位小数)
代码
1 |
n = int(input()) |
分析
这种题乍一看没有思路,需要结合数学知识,求面积就是求一定范围内的积分。当函数变化时,也是同样的做法。
全组合
Input: 一个正整数n。
Ouput: 从1到n的全组合,并且每种组合从组合中选一个代表的总可能数。
代码
1 |
n = int(input()) |
分析
全组合可以通过转化成2进制,然后数1的个数来确定,也可以使用从1到n组合求和来做。
求图中链接相同元素的节点对的数量
Input: 节点数n,边数m;以后m行,m条边。
Output: 链接相同元素的节点对的数量
代码
1 |
line = input().split(' ') |
分析
我这里用了一种最笨的方法,将图存成邻接矩阵,然后两行完全相同(不包含全为0),则代表他们链接的节点相同。
蛇形输出
蛇形输出或者蛇形赋值在很多地方都出现了,在此提供一个模板。
代码
1 |
def Right(i, j, right_end, bottom_end, ret, matrix): |
子串长度
Input: 只包含小写字母的字符串。
Output: 包含连续两个“abcde”或者不包含“abcde”的子串最长长度。
代码
1 |
strs = input() |
字符串分割相等
Input: ","分隔的两个字符串。
Output: 如果两个字符串相同或者分隔成子串相同,则输出“true”,否则输出“false”。
代码
1 |
line = input().split(',') |
分析
递归的思想,如果当前串相同则返回True,否则将串二等分,看子串是否相等。
杨辉三角
Input: 行数n;每一行有2 × i - 1个数字,构成一个三角形。
Output: 从第一行走到最后一行最大的和。
代码
1 |
n = int(input().strip()) |
分析
比较经典的动态规划题。动态规划与递归的区别在于动态规划利用“最优子结构”这个特性,所以下一个状态由上一个状态推出,写代码时是从头往后,而递归则是从后往前。
回字形写入斐波拉契数列
Input: 矩阵的边长n。
Output: 回字形写入斐波拉契数列的
n × n
矩阵。
代码
1 |
def Trans(matrix): |
分析
回字形输出,等价于先输出矩阵第一行,然后将矩阵旋转(这个时候之前的最右列就变成了第一行)再输出,往复到矩阵为空。
前K大的数
求一堆数中前K大的数。 一般可以使用小顶堆来实现。用数组保存堆的时候:左子树 = 父节点 × 2;右子树 = 父节点 × 2 + 1。
代码
1 |
k = 4 |
两个有序的整数列表合并
简单版的归并排序。
代码
1 |
def Sort(list1, list2): |
快速排序
快速排序作为排序的代表,原型或者其变型经常被考察。
代码
1 |
def quick_sort(array, left, right): |
矩阵查找
一个行、列都递增的矩阵中查找某个数。
代码
1 |
def solution(matrix, target): |
连续不为0的区间和最大
Input: 数组长度n;数组的n个值;m个不同分割下标。
Output: 分别输出m个以对应下标分割的子区间的连续不为0的最大和。
代码
1 |
n = int(input()) |
矩阵中“CHINA”的个数
Input: 矩阵大小n,以及
n × n
的字符矩阵。
Output: "CHINA"的个数。
代码
1 |
n = int(input()) |
分析
在矩阵中可以上下左右组合的字符串或者递增子序列之类的问题,都可以使用DFS来做。
字符串中“Good”的数量
Input: 字符串。
Output: Good的数量
代码
1 |
line = input().strip() |
分析
字符串中存在某种子序列,做法大致相同。
矩阵的递增序列
Input:
n × n
矩阵。
Output: 最长递增序列的长度
代码
1 |
n = int(input()) |
分析
一个很明显的思路就是从某点出发,DFS查找最长的递增路径,但是考虑到某些节点可能在之前已经遍历过,可以使用其保存的信息。
不重叠区间
Input: n个不同区间。
Output: 去掉多少区间之后,剩下的区间构成不重叠区间。
代码
1 |
interval_list = [] |
机器人行走
Input: 有t组测试,每一组机器人从(0, 0)位置朝向向上,向右为x轴正方向,向下为y轴正方向,指令有:向左转(L),向右转®,前进N步或者到头(G N)以及打印当前位置(P)。
Output: 打印每个Case的编号以及执行P指令之后的输出。
代码
1 |
t = int(input()) |
将0/1表示的字符串根据莫斯密码转化成字符串
以‘1’表示摩斯密码中的‘·’,以‘111’表示摩斯密码中的‘-’。
以‘0’表示莫斯密码中的分割。
以‘000’表示不同字符摩斯密码的分割。
以‘0000000’表示不同单词的分割。
Input: 以0/1表示的字符串
Output: 转化后的字符串
代码
1 |
line = input().strip() |
数n中各位数字全排列能整除数m的个数
Input: 两个数字n和m。
Output: 数n中各位数字全排列能整除数m的个数。
代码
1 |
line = input().split(' ') |
分析
我的思路是通过逆向观察m倍数需要的那些数字是否都在n里面来判断n的各位全排列能否得到m的倍数。当然,如果n中0的个数大于m的倍数中0的个数是不影响的。
最长回文子串
Input: 字符串
Output: 最长回文子串
代码
1 |
line = input().strip() |
分析
简单的动态规划,但是要考虑两种情况:(1)回文串长度为偶数;(2)回文串长度为奇数即中间的字母不用回文。
大鱼吃小鱼
Input: 长度为n的整数串
Output: 每次大鱼吃小鱼,可以同时进行,输出大鱼吃小鱼的次数。
代码
1 |
n = int(input()) |
非递归版二叉树深度
代码
1 |
num =int(input()) |
分析
二叉树深度就是二叉树层数,所以可以使用层序遍历二叉树实现。
数组中出现超过一半的数字
代码
1 |
def majorityElement(nums: List[int]) -> int: |
分析
每一步设定当前值为“大于一半的数”并将此时的值记为“+1”,往后遇到不同的值在该值上“-1”,遇到值为0,则将前面的序列舍弃,重新开始计数。最终在序列扫描一遍之后的假设“大于一半的数”的值即为最终结果。
最长不含重复字符的子字符串
描述
从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。
Input: “abcabcbb”
Output: 3
Reason: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
代码
1 |
class Solution: |
分析
可以用动态规划来解,首先定义函数Find_i
,用来找到当前i
节点往前最近与之相同的字符的位置(没有则返回-1
)。
然后,状态转移方程为:
dp[i] = dp[i - 1] + 1
,当dp[i - 1] < i - Find_i(s, i)
时,否则:dp[i] = i - Find_i(s, i)
。
最后返回dp
最大值,即为所求。
The link of this page is https://blog.nooa.tech/articles/fdc308a8/ . Welcome to reproduce it!