竞争性编程 :high_brightness::high_brightness:
你好,程序员们💻, 这里是你所有竞争性编程资源的一站式目的地。
:pushpin::pushpin: 什么是竞争性编程? :pushpin::pushpin:
在我看来,竞争性编程是一项运动。这项运动基于问题解决能力、思维能力、速度测试、规律性和精确性。竞争性编程将帮助你建立逻辑并实施该逻辑来解决现实世界的问题。对代码进行头脑风暴不仅会提高你的编码技能,还会帮助扩展你的思维能力。因此,日常练习竞争性编程有助于你掌握特定的编程语言。相信我们,如果你经常参与这项运动,你就已经为面试的技术轮做好了准备。那么现在让我们一起潜入竞争性编程的海洋吧。
练习竞争性编程的平台 :telescope::telescope:
-
HackerRank(新手必做)
-
CodeChef
-
CodeForces
-
HackerEarth
-
Project Euler(数学类)
-
GeeksForGeeks
-
LeetCode(数据结构和算法)
-
AtCoder
-
interviewBit
-
Sphere Online Judge(SPOJ)
-
TopCoder
-
Leetcode(月度挑战)
-
CSES
-
binarysearch
-
Coderbyte
竞争性编程的好处
竞争性编程所需的技能对你作为开发者的职业生涯有长期的益处。参与竞争性编程有许多好处,包括:
求职:参与竞争性编程可以使你成为公司青睐的候选人。当你参加像ACM国际大学生程序设计竞赛这样的大型比赛时,你有很好的机会进入苹果、Facebook、IBM、谷歌等公司的视线。科技公司会关注这些比赛和活动以寻找潜在的员工。大型竞争性编程活动非常有声望且难以取得成功,所以如果你表现出色,这就是你技术才能和能力的一个指标。这就是为什么许多公司赞助编程比赛的原因。
团队合作技能:当你参与这些比赛时,你经常会在团队中工作,这意味着你学会了如何在高压时刻与队友互动。这是一项非常重要的技能。当你作为软件工程师工作时,你几乎总是会与他人合作,这意味着公司非常看重你的沟通和团队技能。此外,大多数团队都会有一个领导。如果你是团队的领导,这就展示了管理技能,使你成为更加理想的候选人。公司希望知道你能够有效并舒适地与队友合作。
面试准备:当你尝试获得一份工程工作时,公司会测试你对数据结构和算法的了解。当你参与竞争性编程时,你会努力发展对这些概念的深入理解。此外,编码面试和竞争性编程的环境非常相似。它们都是高压环境,你必须在其中进行问题解决。虽然许多人可能无法适应这种环境,但你的比赛经验给了你一个优势。
最著名的编程比赛 :crown: :crown:
即将到来的比赛时间表 - https://clist.by/
- 谷歌 KickStart🏆
- ACM ICPC(编程奥林匹克)🏆
- 谷歌 CodeJam🏆
- Facebook 黑客杯🏆
- TCS CodeVita🏆
- 谷歌 HashCode🏆
- CodeChef 的 SnackDown🏆
- Coding Block 的 CodeSule🏆
- Codechef 长期挑战🏆
- Codechef Cook-Off 🏆
- Codechef Lunchtime🏆
- Codeforces Rounds Div1 & Div2 & Div3 & Educational Codeforces Round🏆
书籍 :high_brightness::high_brightness:
- 竞赛编程3📚
- 数据结构与算法轻松学📚 - Narasimha Karumanchi 著
- 破解编程面试📚 - Gayle Laakmann McDowell 著
- Antti Laaksonen 的 CP 手册
- 竞争性编程倡议的 USACO 指南
- 竞赛程序员手册 - Antti Laaksonen 著
算法 :high_brightness::high_brightness:
代码可视化 :high_brightness::high_brightness:
学习资源(按主题) :checkered_flag::checkered_flag::checkered_flag:
大 O 表示法
- CS Dojo - 大 O 表示法和时间复杂度简介
- Simple Snippets - 算法的渐近分析及示例
- Big-O 速查表 https://www.bigocheatsheet.com/
C++ 中的 STL
二分查找
- Aditya Verma 视频
问题
- 分配最少页数(GFG)
- 愤怒的奶牛(SPOJ)
- Prata(SPOJ)
- 画家分区(GFG)
- EKO(SPOJ)
- 用二分查找求平方根(GFG)
- 有序数组中的向下取整和向上取整(GFG)
- 元素的第一次和最后一次出现(GFG)
- 有序数组中元素的计数(GFG)
- 在旋转排序数组中搜索(leetcode)
- 日志(Atcoder)
- 在二维矩阵中搜索(Leetcode)
- 第一个错误版本(Leetcode)
- 加热器(Leetcode)
数论(数学)
- CodeNCode - 视频
递归和回溯
位运算
图论
动态规划
编程平台
- 初学者 - 在Codecademy上练习
- 初学者 - 在GeeksForGeeks上练习
- 初学者 - HackerRank(初学者必做)
- 初学者 - HackerEarth
- 长期挑战和短期比赛 - CodeChef
- 短期比赛 - CodeForces
- 数学 - Project Euler
- 数据结构和算法 - LeetCode(用于数据结构和算法)
重要数据结构:
搜索
- 线性搜索
- 二分搜索
- 三分搜索
- 跳跃搜索
- 插值搜索
- 指数搜索
排序
- 选择排序
- 冒泡排序
- 插入排序
- 归并排序
- 快速排序
- 堆排序
- 基数排序
- 计数排序
- 桶排序
数学:
播放列表
数论
- 素数生成(筛法、分段筛法)
- 欧拉函数定理
- 费马定理
- 最大公约数和最小公倍数(欧几里得算法)
- 扩展欧几里得算法
- 斐波那契数列
- 中国剩余定理
- 线性丢番图方程(扩展欧几里得)
- 二进制幂
- 模运算(加法、乘法、减法、模逆元)
概率论
- 基本概率和条件概率
- 随机变量
- 概率生成函数
- 期望
- 概率分布 [二项分布、泊松分布、正态分布、伯努利分布]
线性代数
- 矩阵乘法(Strassen算法)、对数幂
- 矩阵变换 [转置、矩阵旋转、用矩阵表示线性变换]
- 矩阵的行列式、秩和逆 [高斯消元法、高斯-约当消元法]
- 解线性方程组
- 矩阵幂解递推关系
博弈论 - 视频
贪心算法
问题
- BUSY MAN(SPOJ)
- BIASED STANDINGS(SPOJ)
- life(SPOJ)
- Defense of a kingdom (SPOJ)
- Chopsticks(Codechef)
- EXPEDI(SPOJ)
- 分数背包(GFG)
- DIE HARD(SPOJ)
- GREGOVIA(SPOJ)
- SOLDIER(SPOJ)
- CHOCOLA(SPOJ)
- CMIYC(SPOJ)
- Station Balance(UVA)
- 霍夫曼编码(GFG)
- Maximun Unique Segments(Codechef)
- 埃及分数(GFG)
- 作业排序(GFG)
- Maximum Circles(HackerBlocks)
- Codeforces Subsequences(Codeforces)
- Good Strings(Codeforces)
- Palindromic Paths(Codeforces)
- Gas Pipeline(Codeforces)
图论:
播放列表
- CodeNCode - 视频
图的表示
- 邻接矩阵
- 邻接表
图的类型
- 有向图
- 无向图
- 加权图
- 非加权图
- 欧拉图
图的概念
- 深度优先搜索
- 广度优先搜索
- 强连通分量
- 连通分量
- 环检测
- 割点
- 桥
- 拓扑排序
- 二分图检测
- 泛洪算法
图/树算法
- Prim算法
- Kruskal算法
- Dijkstra算法
- Bellman-Ford算法
- Floyd Warshall算法
- 欧拉回路
- 使用二进制提升的最近公共祖先
- Kruskal最小生成树算法
动态规划
播放列表
经典问题
- 斐波那契数列
- 最长公共子串
- 最长递增子序列
- 最长回文子串
- 编辑距离
- 扔鸡蛋问题
- 0-1背包问题
- 无限背包问题
- 子集和问题
- 硬币找零组合
- 硬币找零排列
- 最长公共子序列
- 无重复字符的最长子串
- 矩阵链乘法
- 最大全1正方形子矩阵
- 最长链
- 卡特兰数及其应用
- 蛇梯棋问题
- 单词拆分问题
- N皇后问题