废话不多说,现在我给你4道拼多多的笔试算法题,你觉得你可以得多少分?
不管会不会,请继续看文末的[阿里云算法笔试合集],意外从朋友那里嫖的,这是一本能“在线”编程的程序员面试宝典,分享给有需要的朋友,
评论区留言或是私信即可免费获取哦
第一题:按题意模拟,注意第N次到的话特判,否则只能过96%
#include <bits/stdc++.h>
using namespace std;
using LL = long long;
int k, n;
int x;
signed main() {
// freopen("in", "r", stdin);
// freopen("out", "w", stdout);
while (~scanf("%d%d", &k, &n)) {
int cur = 0, cnt = 0;
int ok = 0;
for (int i = 1; i <= n; i++) {
scanf("%d", &x);
if (ok) continue;
if (cur + x == k) {
if(n != i) ok = 1;
cur += x;
} else if (cur + x > k) {
cnt++;
cur = k - (cur + x - k);
} else {
cur += x;
}
}
if (ok || k == 0) {
printf("paradox\n");
} else {
printf("%d %d\n", k - cur, cnt);
}
}
return 0;
}
第二题:我是枚举了24种同构+并查集做的,一定有聪明的小朋友写出了预处理
#include <bits/stdc++.h>
using namespace std;
using LL = long long;
#define A 1
#define B 2
#define C 3
#define D 4
#define E 5
#define F 6
const int maxn = 1010;
int n;
int dice[maxn][7];
int pre[maxn];
int find(int x) {
return x == pre[x] ? x : pre[x] = find(pre[x]);
}
void unite(int x, int y) {
x = find(x); y = find(y);
pre[x] = y;
}
int check(int x, int y) {
if (dice[x][1]==dice[y][A]&&dice[x][2]==dice[y][B]&&dice[x][3]==dice[y][C]&&dice[x][4]==dice[y][D]&&dice[x][5]==dice[y][E]&&dice[x][6]==dice[y][F]) return 1;
if (dice[x][1]==dice[y][C]&&dice[x][2]==dice[y][D]&&dice[x][3]==dice[y][B]&&dice[x][4]==dice[y][A]&&dice[x][5]==dice[y][E]&&dice[x][6]==dice[y][F]) return 1;
if (dice[x][1]==dice[y][B]&&dice[x][2]==dice[y][A]&&dice[x][3]==dice[y][D]&&dice[x][4]==dice[y][C]&&dice[x][5]==dice[y][E]&&dice[x][6]==dice[y][F]) return 1;
if (dice[x][1]==dice[y][D]&&dice[x][2]==dice[y][C]&&dice[x][3]==dice[y][A]&&dice[x][4]==dice[y][B]&&dice[x][5]==dice[y][E]&&dice[x][6]==dice[y][F]) return 1;
if (dice[x][1]==dice[y][A]&&dice[x][2]==dice[y][B]&&dice[x][3]==dice[y][D]&&dice[x][4]==dice[y][C]&&dice[x][5]==dice[y][F]&&dice[x][6]==dice[y][E]) return 1;
if (dice[x][1]==dice[y][C]&&dice[x][2]==dice[y][D]&&dice[x][3]==dice[y][A]&&dice[x][4]==dice[y][B]&&dice[x][5]==dice[y][F]&&dice[x][6]==dice[y][E]) return 1;
if (dice[x][1]==dice[y][B]&&dice[x][2]==dice[y][A]&&dice[x][3]==dice[y][C]&&dice[x][4]==dice[y][D]&&dice[x][5]==dice[y][F]&&dice[x][6]==dice[y][E]) return 1;
if (dice[x][1]==dice[y][D]&&dice[x][2]==dice[y][C]&&dice[x][3]==dice[y][B]&&dice[x][4]==dice[y][A]&&dice[x][5]==dice[y][F]&&dice[x][6]==dice[y][E]) return 1;
if (dice[x][1]==dice[y][A]&&dice[x][2]==dice[y][B]&&dice[x][3]==dice[y][F]&&dice[x][4]==dice[y][E]&&dice[x][5]==dice[y][C]&&dice[x][6]==dice[y][D]) return 1;
if (dice[x][1]==dice[y][F]&&dice[x][2]==dice[y][E]&&dice[x][3]==dice[y][B]&&dice[x][4]==dice[y][A]&&dice[x][5]==dice[y][C]&&dice[x][6]==dice[y][D]) return 1;
if (dice[x][1]==dice[y][B]&&dice[x][2]==dice[y][A]&&dice[x][3]==dice[y][E]&&dice[x][4]==dice[y][F]&&dice[x][5]==dice[y][C]&&dice[x][6]==dice[y][D]) return 1;
if (dice[x][1]==dice[y][E]&&dice[x][2]==dice[y][F]&&dice[x][3]==dice[y][A]&&dice[x][4]==dice[y][B]&&dice[x][5]==dice[y][C]&&dice[x][6]==dice[y][D]) return 1;
if (dice[x][1]==dice[y][A]&&dice[x][2]==dice[y][B]&&dice[x][3]==dice[y][E]&&dice[x][4]==dice[y][F]&&dice[x][5]==dice[y][D]&&dice[x][6]==dice[y][C]) return 1;
if (dice[x][1]==dice[y][E]&&dice[x][2]==dice[y][F]&&dice[x][3]==dice[y][B]&&dice[x][4]==dice[y][A]&&dice[x][5]==dice[y][D]&&dice[x][6]==dice[y][C]) return 1;
if (dice[x][1]==dice[y][B]&&dice[x][2]==dice[y][A]&&dice[x][3]==dice[y][F]&&dice[x][4]==dice[y][E]&&dice[x][5]==dice[y][D]&&dice[x][6]==dice[y][C]) return 1;
if (dice[x][1]==dice[y][F]&&dice[x][2]==dice[y][E]&&dice[x][3]==dice[y][A]&&dice[x][4]==dice[y][B]&&dice[x][5]==dice[y][D]&&dice[x][6]==dice[y][C]) return 1;
if (dice[x][1]==dice[y][F]&&dice[x][2]==dice[y][E]&&dice[x][3]==dice[y][C]&&dice[x][4]==dice[y][D]&&dice[x][5]==dice[y][A]&&dice[x][6]==dice[y][B]) return 1;
if (dice[x][1]==dice[y][C]&&dice[x][2]==dice[y][D]&&dice[x][3]==dice[y][E]&&dice[x][4]==dice[y][F]&&dice[x][5]==dice[y][A]&&dice[x][6]==dice[y][B]) return 1;
if (dice[x][1]==dice[y][E]&&dice[x][2]==dice[y][F]&&dice[x][3]==dice[y][D]&&dice[x][4]==dice[y][C]&&dice[x][5]==dice[y][A]&&dice[x][6]==dice[y][B]) return 1;
if (dice[x][1]==dice[y][D]&&dice[x][2]==dice[y][C]&&dice[x][3]==dice[y][F]&&dice[x][4]==dice[y][E]&&dice[x][5]==dice[y][A]&&dice[x][6]==dice[y][B]) return 1;
if (dice[x][1]==dice[y][E]&&dice[x][2]==dice[y][F]&&dice[x][3]==dice[y][C]&&dice[x][4]==dice[y][D]&&dice[x][5]==dice[y][B]&&dice[x][6]==dice[y][A]) return 1;
if (dice[x][1]==dice[y][D]&&dice[x][2]==dice[y][C]&&dice[x][3]==dice[y][E]&&dice[x][4]==dice[y][F]&&dice[x][5]==dice[y][B]&&dice[x][6]==dice[y][A]) return 1;
if (dice[x][1]==dice[y][F]&&dice[x][2]==dice[y][E]&&dice[x][3]==dice[y][D]&&dice[x][4]==dice[y][C]&&dice[x][5]==dice[y][B]&&dice[x][6]==dice[y][A]) return 1;
if (dice[x][1]==dice[y][C]&&dice[x][2]==dice[y][D]&&dice[x][3]==dice[y][F]&&dice[x][4]==dice[y][E]&&dice[x][5]==dice[y][B]&&dice[x][6]==dice[y][A]) return 1;
return 0;
}
signed main() {
// freopen("in", "r", stdin);
// freopen("out", "w", stdout);
while (~scanf("%d", &n)) {
for (int i = 1; i <= n; i++) {
pre[i] = i;
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= 6; j++) {
scanf("%d", &dice[i][j]);
}
}
for (int i = 1; i <= n; i++) {
for (int j = i + 1; j <= n; j++) {
if (check(i, j)) unite(i, j);
}
}
int ret1 = 0;
for (int i = 1; i <= n; i++) {
if (i == find(i)) ret1++;
}
printf("%d\n", ret1);
map<int, int> vis;
for (int i = 1; i <= n; i++) {
vis[find(i)]++;
}
vector<int> ret2;
for (const auto &x : vis) {
ret2.emplace_back(x.second);
}
sort(ret2.begin(), ret2.end(), greater<int>());
for (int i = 0; i < ret2.size(); i++) {
printf("%d%c", ret2[i], " \n"[i == ret2.size() - 1]);
}
}
return 0;
}
贴一下枚举的图吧。。
第三题:按美味程度、能量数的顺序从小到大排序,然后枚举lunch,二分dinner的美味程度,更新答案。记得单独讨论只吃一顿或者一顿都不吃的情况。
#include <bits/stdc++.h>
using namespace std;
using LL = long long;
using pii = pair<int, int>;
const int maxn = 100100;
int n, m, t;
pii lunch[maxn], dinner[maxn];
int suf[maxn];
signed main() {
// freopen("in", "r", stdin);
// freopen("out", "w", stdout);
while (~scanf("%d%d%d",&n,&m,&t)) {
for (int i = 1; i <= n; i++) {
scanf("%d%d",&lunch[i].second, &lunch[i].first);
}
for (int i = 1; i <= m; i++) {
scanf("%d%d",&dinner[i].second, &dinner[i].first);
}
if (t == 0) {
printf("0\n");
continue;
}
sort(lunch + 1, lunch + n + 1);
sort(dinner + 1, dinner + m + 1);
int ret = INT_MAX;
for (int i = 1; i <= n; i++) {
if (lunch[i].first >= t) ret = min(ret, lunch[i].second);
}
for (int i = 1; i <= m; i++) {
if (dinner[i].first >= t) ret = min(ret, dinner[i].second);
suf[i] = dinner[i].second;
}
for (int i = m - 1; i >= 1; i--) {
suf[i] = min(suf[i + 1], suf[i]);
}
for (int i = 1; i <= n; i++) {
if (lunch[i].first >= t) continue;
int require = t - lunch[i].first;
if (dinner[m].first < require) continue;
int lo = 1, hi = m;
while (lo <= hi) {
int mid = (lo + hi) >> 1;
if (dinner[mid].first >= require) {
ret = min(ret, suf[mid] + lunch[i].second);
hi = mid - 1;
} else {
lo = mid + 1;
}
}
}
printf("%d\n", ret == INT_MAX ? -1 : ret);
}
return 0;
}
第四题:一开始读错题了,我以为就6个'#'. 所以我写了个预处理暴力。正解插头DP
#include <bits/stdc++.h>
using namespace std;
using LL = long long;
using pii = pair<int, int>;
const LL mod = 1E9 + 9;
const int dx[5] = {0, 0, 1, -1};
const int dy[5] = {1, -1, 0, 0};
const int maxn = 7;
char s[maxn][maxn];
vector<pii> pos;
int n = 6, m = 6;
LL ret;
vector<vector<int>> status;
vector<int> tmp;
void pre(int cnt, int cap) {
if (cnt == min((int)pos.size() + 1, 7)) {
status.emplace_back(tmp);
return;
}
for (int i = 1; i <= 6; i++) {
// if (i == cap) continue;
tmp.emplace_back(i);
pre(cnt + 1, i);
tmp.pop_back();
}
}
int check(int x, int y) {
return x >= 1 && x <= 6 && y >= 1 && y <= 6;
}
int ok() {
for (int i = 1; i <= 6; i++) {
for (int j = 1; j <= 6; j++) {
for (int k = 0; k < 4; k++) {
int x = i + dx[k];
int y = j + dy[k];
if (!check(x, y)) continue;
if (s[i][j] == '*') continue;
if (s[x][y] == s[i][j]) return 0;
}
}
}
return 1;
}
signed main() {
// freopen("in", "r", stdin);
// freopen("out", "w", stdout);
pos.clear();
for (int i = 1; i <= 6; i++) {
scanf("%s", s[i] + 1);
for (int j = 1; j <= 6; j++) {
if (s[i][j] == '#') pos.emplace_back(i, j);
}
}
tmp.clear();
status.clear();
pre(1, -1);
for (int i = 0; i < status.size(); i++) {
for (int j = 0; j < pos.size(); j++) {
int x = pos[j].first, y = pos[j].second;
s[x][y] = status[i][j] + '0';
}
if (ok()) {
ret++;
if (ret >= mod) ret %= mod;
}
for (int j = 0; j < pos.size(); j++) {
int x = pos[j].first, y = pos[j].second;
s[x][y] = '#';
}
}
printf("%lld\n", ret);
return 0;
}
没得100分,确定不来啃啃[阿里云-超全算法笔试模拟题精解合集]?
[阿里云-超全算法笔试模拟题精解合集]--70+算法题、30种大厂笔试高频知识点
这是一本“在线”编程的程序员面试宝典,解析之后的每个题都有其拓展链接,点击可进入模拟场进行训练,这边篇幅原因,题目列举完,但是解析只有部分,不过完整的原版文件可免费分享给需要刷题训练的伙伴,
评论区留言或是私信即可免费获取哦
算法的思想
1.1 排序
排序算法笔试题精解-“数组变换”
排序算法笔试题精解-“打怪兽”
1.2 贪心
贪心算法笔试题精解-“最大边权和"
贪心算法笔试题精解-“最强的团队”
贪心算法笔试题精解-“Tom爱吃巧克力”
贪心算法笔试题精解-“吃奶酪”
贪心算法笔试题精解-“一的个数”
贪心算法笔试题精解-“Bob的花束”
贪心算法笔试题精解-“钱主”
贪心算法笔试题精解-“移动射击”
贪心算法笔试题精解-“相似数组”
贪心算法笔试题精解-“过吊桥”
贪心算法笔试题精解-“完美排列”
贪心算法笔试题精解-“采摘圣诞果"
贪心算法比赛题精解-“Tairitsu and Dynamic Objects"
贪心算法笔试题精解-“Codancer的炸弹引爆”
贪心算法笔试题精解-“学习小组”
贪心算法笔试题精解-“恢复字符串”
1.3 DP/动态规划
DP/动态规划算法笔试题精解-“矩阵最小路径和”
DP/动态规划算法笔试题精解-“寻找等比数列”
DP/动态规划算法笔试题精解-“字符配对”
DP/动态规划算法笔试题精解-“数组染色”
DP/动态规划算法笔试题精解-“连绵的群山”
DP/动态规划算法笔试题精解-“难住Tom 的问题”
DP/动态规划算法笔试题精解-“变化的字符”
DP/动态规划算法笔试题精解-“跳房子”
DP/动态规划算法笔试题精解-“寒假活动”
DP/动态规划算法笔试题精解-“最短路”
DP/动态规划算法笔试题精解-“codancer上楼”
DP/动态规划算法笔试题精解-“木棒拼接”
DP/动态规划算法笔试题精解-“Codancer的数组封印"
DP/动态规划算法笔试题精解-“Jerry的异或运算”
DP/动态规划算法笔试题精解-“小明的数学作业"
DP/动态规划算法笔试题精解-“奇偶数列"
1.4 剪枝
剪枝算法笔试题精解-“斐波那契字符数”
1.5 尺取法
尺取法算法笔试题精解-“超级区间”
尺取法算法笔试题精解-“调整数组”
尺取法算法笔试题精解-“最优分组”
尺取法算法笔试题精解-“破译密码”
- 排序-题目解析
排序-题目解析
- 贪心-题目解析
贪心-题目解析
- DP/动态规划-题目解析
DP/动态规划-题目解析
- 剪枝-题目解析
- 尺取法-题目解析
尺取法-解析
数据结构
2.1图
算法笔试题精解-“变换的密钥”
2.2 搜索
搜索算法笔试题精解-“2的幂次方数”
搜索算法笔试题精解-“能量半径”
搜索算法笔试题精解-“苹果收获程序”
搜索算法笔试题精解-“恐怖的辐射”
搜索算法笔试题精解-“树的拆分”
搜索算法笔试题精解-“Password”
搜索算法笔试题精解-“神奇数字在哪里”
搜索算法笔试题精解-“神奇的棋子”
2.3 树
算法笔试模精解-“全奇数组”
算法笔试模精解-“Codancer的旅行”
算法笔试模精解-“Codancer的求和”
算法笔试模精解-“找出二叉搜索树的第2大的数”
2.4 线型
线型算法笔试题精解-“最大矩形面积"
线型算法笔试题精解-“最活跃的数”
线型算法笔试题精解-“非递减序列”
线型算法笔试题精解-“Tom跳方格”
线型算法笔试题精解-“复杂的字符串”
线型算法笔试题精解-“神秘消失”
- 图-题目解析
图-题目解析
- 搜索-题目解析
搜索-题目解析
- 树-题目解析
树-题目解析
- 线型-题目解析
线型-题目解析
计算
算法笔试模拟题精解之“最后的胜者”
算法笔试模拟题精解之“简单题?
算法笔试模拟题精解之“朋友一生一起走”
算法笔试模拟题精解之“正三角塔”
算法笔试模拟题精解之“组队难题”
算法笔试模拟题精解之“2n合体”
算法笔试模拟题精解之“平行线”
算法笔试模拟题精解之“叠叠高”
算法笔试模拟题精解之“公平”
算法笔试模拟题精解之“Tom的手工课”
算法笔试模拟题精解之“填数问题”
算法笔试模拟题精解之“Jerry的考验"
算法笔试模拟题精解之“超车”
算法笔试模拟题精解之“坏掉的时钟”
算法笔试模拟题精解之“期末考试"
算法笔试模拟题精解之“滑雪比赛”
解析
解析
看完阿里云出品的[算法笔试模拟题精解],再来刷刷左程云大神的[程序员代码面试指南]
第一部分:栈和队列部分(10)
设计一个有getMin功能的栈
由两个栈组成的队列
如何仅用递归函数和栈操作逆序一个栈
猫狗队列
用一个栈实现另一个栈的排序
用栈来求解汉诺塔问题
生成窗口最大值数组
构造数组的MaxTree
求最大子矩阵的大小
最大值减去最小值小于或等于num的子数组数量
\
第二部分:链表问题(20)
打印两个有序链表的公共部分
在单链表和双链表中删除倒数第K 个节点
删除链表的中间节点和a/b 处的节点
反转单向和双向链表
反转部分单向链表
环形单链表的约瑟夫问题
判断一个链表是否为回文结构
将单向链表按某值划分成左边小、中间相等、右边大的形式
复制含有随机指针节点的链表
两个单链表生成相加链表
两个单链表相交的一系列问题
将单链表的每K个节点之间逆序
删除无序单链表中值重复出现的节点
在单链表中删除指定值的节点
将搜索二叉树转换成双向链表
单链表的选择排序
一种怪异的节点删除方式
向有序的环形单链表中插入新节点
合并两个有序的单链表
按照左右半区的方式重新组合单链表
\
第三部分:二叉树问题(24)
分别用递归和非递归方式实现二叉树先序、中序和后序遍历
打印二叉树的边界节点
如何较为直观地打印二叉树
二叉树的序列化和反序列化
遍历二叉树的神级方法
在二叉树中找到累加和为指定值的最长路径长度
找到二叉树中的最大搜索二叉子树
找到二叉树中符合搜索二叉树条件的最大拓扑结构
二叉树的按层打印与ZigZag打印
调整搜索二叉树中两个错误的节点
判断t1 树是否包含t2 树全部的拓扑结构
判断t1 树中是否有与t2 树拓扑结构完全相同的子树
判断二叉树是否为平衡二叉树
根据后序数组重建搜索二叉树
判断一棵二叉树是否为搜索二叉树和完全二叉树
在二叉树中找到一个节点的后继节点
在二叉树中找到两个节点的最近公共祖先
Tarjan算法与并查集解决二叉树节点间最近公共祖先的批量查询问题
二叉树节点间的最大距离问题
先序、中序和后序数组两两结合重构二叉树
通过先序和中序数组生成后序数组
统计和生成所有不同的二叉树
统计完全二叉树的节点数
\
第四部:分递归和动态规划(17)
斐波那契系列问题的递归和动态规划
矩阵的最小路径和
换钱的最少货币数
换钱的方法数
最长递增子序列
汉诺塔问题
最长公共子序列问题
最长公共子串问题
最小编辑代价
字符串的交错组成
龙与地下城游戏问题
数字字符串转换为字母组合的种数
表达式得到期望结果的组成种数
排成一条线的纸牌博弈问题
跳跃游戏
数组中的最长连续序列
N皇后问题
\
第五部分:字符串问题(23)
判断两个字符串是否互为变形词
字符串中数字子串的求和
去掉字符串中连续出现k 个0 的子串
判断两个字符串是否互为旋转词
将整数字符串转成整数值
替换字符串中连续出现的指定字符串
字符串的统计字符串
判断字符数组中是否所有的字符都只出现过一次
在有序但含有空的数组中查找字符串
字符串的调整与替换
翻转字符串
数组中两个字符串的最小距离
添加最少字符使字符串整体都是回文字符串
括号字符串的有效性和最长有效长度
公式字符串求值
0 左边必有1 的二进制字符串数量
拼接所有字符串产生字典顺序最小的大写字符串
找到字符串的最长无重复字符子串
找到被指的新类型字符
最小包含子串的长度
回文最少分割数
字符串匹配问题
字典树(前缀树)的实现
\
第六部分:大数据和空间限制(6)
认识布隆过滤器
只用2 GB 内存在20 亿个整数中找到出现次数最多的数.
40 亿个非负整数中找到没出现的数
找到100 亿个URL 中重复的URL 以及搜索词汇的top K 问题
40 亿个非负整数中找到出现两次的数和所有数的中位数
一致性哈希算法的基本原理
\
第七部分:位运算(6)
不用额外变量交换两个整数的值
不用任何比较判断找出两个数中较大的数
只用位运算不用算术运算实现整数的加减乘除运算
整数的二进制表达中有多少个1
在其他数都出现偶数次的数组中找到出现奇数次的数
在其他数都出现k 次的数组中找到只出现一次的数
\
第八部分:数组和矩阵问题(26)
转圈打印矩阵
将正方形矩阵顺时针转动90 °
"之"字形打印矩阵
找到无序数组中最小的k 个数
需要排序的最短子数组长度
在数组中找到出现次数大于N/K 的数
在行列都排好序的矩阵中找数
最长的可整合子数组的长度
不重复打印排序数组中相加和为给定值的所有二元组和三元组
未排序正数数组中累加和为给定值的最长子数组长度
未排序数组中累加和为给定值的最长子数组系列问题
未排序数组中累加和小于或等于给定值的最长子数组长度
计算数组的小和
自然数数组的排序
奇数下标都是奇数或者偶数下标都是偶数
子数组的最大累加和问题
子矩阵的最大累加和问题
在数组中找到一个局部最小的位置
数组中子数组的最大累乘积
打印N 个数组整体最大的Top K
边界都是1 的最大正方形大小
不包含本位置值的累乘数组
数组的partition 调整
求最短通路值
数组中未出现的最小正整数
数组排序之后相邻数的最大差值
\
第九部分:其他问题(34)
从5 随机到7 随机及其扩展
一行代码求两个数的最大公约数
有关阶乘的两个问题
判断一个点是否在矩形内部
判断一个点是否在三角形内部
折纸问题
蓄水池算法
设计有setAll功能的哈希表
最大的leftMax与rightMax之差的绝对值
设计可以变更的缓存结构
设计RandomPool结构
调整[0 ,x)区间上的数出现的概率
路径数组变为统计数组
正数数组的最小不可组成和
一种字符串和数字的对应关系
1 到n 中1 出现的次数
从N 个数中等概率打印M 个数
判断一个数是否是回文数
在有序旋转数组中找到最小值
在有序旋转数组中找到一个数
数字的英文表达和中文表达
分糖果问题
一种消息接收并打印的结构设计
设计一个没有扩容负担的堆结构
随时找到数据流的中位数
在两个长度相等的排序数组中找到上中位数
在两个排序数组中找到第K 小的数
两个有序数组间相加和的TOP K 问题
出现次数的TOP K 问题
Manacher算法
KMP 算法
丢棋子问题
画匠问题
邮局选址问题
具体解析
具体解析
篇幅有限,解析加起来总共都有500多页, 就不多说了 **,想看完整解析:阿里云出品的[算法笔试模拟题精解]+左程云大神的[程序员代码面试指南]