如今不论是校招还是社招,大多数公司都会有笔试+面试的算法题,以此来考察候选人的数据结构和算法能力,因此我们面试前最好复习下算法,简单来说就是刷题呗!
以下是本人社招时在Leetcode和牛客网上的大厂的高频题,大概二三百道,此系列只列出最热门的一百来道,代码都是Leetcode上的,可以正常运行。大家可以根据下面推荐的题目来有选择的刷题,最好是进入Leetcode或牛客来刷,里面有许多优秀解法可以参考!
常见算法有背包、DFS、BFS、动态规划、数组、状态压缩、图优化、数学推导、字符串、链表二叉树、邻接表、图优化等等。
下面是正常的题目,大家可以参考一下:
1、比较版本号
https://leetcode-cn.com/problems/compare-version-numbers/
/**
输入:version1 = "0.1", version2 = "1.1"
输出:-1
解释:version1 中下标为 0 的修订号是 "0",version2 中下标为 0 的修订号是 "1" 。0 < 1,所以 version1 < version2
**/
class Solution {
public:
void sub(string version1,vector<string> &res){
while (!version1.empty()) {
int i = 0;
while (i < version1.size() && version1[i] != '.') {
i++;
}
string s1 = version1.substr(0, i);
res.push_back(s1);
if (i + 1 >= version1.size())
break;
version1 = version1.substr(i+1);
}
}
int compareVersion(string version1, string version2) {
vector<string> res1;
vector<string> res2;
sub(version1,res1);
sub(version2,res2);
int i = 0;
for(;i<res1.size()&&i<res2.size();i++){
int k1 = stoi(res1[i]);
int k2 = stoi(res2[i]);
if(k1>k2)return 1;
if(k1<k2)return -1;
}
int k1 =i,k2=i;
while(k1<res1.size()){
if(stoi(res1[k1])==0)
k1++;
else
return 1;
}
while(k2<res2.size()){
if(stoi(res2[k2])==0)
k2++;
else
return -1;
}
return 0;
}
};
//2021.05.29
2、最小生成树 ———— 可以采用并查集
/*
描述
一个有n户人家的村庄,有m条路连接着。村里现在要修路,每条路都有一个代价,现在请你帮忙计算下,最少需要花费多少的代价,就能让这n户人家连接起来。
示例1
输入:
3,3,[[1,3,3],[1,2,1],[2,3,1]]
返回值:
2
*/
class Solution {
publi