C++ 实现 180 多个算法和数据结构

mandliya/algorithms_and_data_structures: 180+ Algorithm & Data Structure Problems using C++ (github.com)

下载下来,可以学习。

中国互联网公司本质上是广告公司,赚取整个经济的钱。和软件公司不一样,软件公司卖软件。凭本事吃饭,在中国凭本事吃饭都要饿死的。所以搞技术一定要进互联网公司。

互联网公司才能给出百万年薪,才有高深技术的实验场景。

对于IT专业的学生来说,提高算法能力是非常重要的,因为算法是计算机科学的核心组成部分,并且在互联网公司中尤其受到重视。以下是一些建议,可以帮助学生提高他们的算法能力:

  1. 掌握基础知识:

    • 深入理解数据结构和算法的基本原理,如数组、链表、栈、队列、树、图等。

    • 学习并理解各种排序和搜索算法,如快速排序、归并排序、二分搜索等。

    • 了解算法复杂度分析(时间复杂度和空间复杂度)。

  2. 刷题实践:

    • 在在线平台(如LeetCode、LintCode、HackerRank等)上解决算法问题。

    • 参与编程竞赛和算法挑战,如ACM/ICPC、CodeChef、TopCoder等。

    • 定期为自己设定目标,例如每周解决一定数量的新问题。

  3. 参加课程和研讨会:

    • 参加在线课程,如Coursera、edX、Udemy等提供的算法和数据结构课程。

    • 参加学校或社区的研讨会和讲座,与专家和行业人士交流。

  4. 阅读和理解优秀代码:

    • 阅读开源项目中的算法实现,理解其工作原理。

    • 学习优秀程序员编写的代码,理解他们的思维方式和代码风格。

  5. 实际项目应用:

    • 在个人项目或课程项目中实际应用算法,解决实际问题。

    • 参与需要算法技能的实习或项目工作,获得实际工作经验。

  6. 持续学习和自我挑战:

    • 保持对新算法和技术的关注,不断学习新知识。

    • 挑战自己,尝试解决更难的问题,不断提高自己的算法设计和优化能力。

  7. 交流和合作:

    • 加入学习小组或社区,与他人一起讨论和解决问题。

    • 通过社交媒体、技术博客、论坛等渠道与其他算法爱好者交流心得。

提高算法能力需要时间和坚持。通过不断的实践和挑战自己,IT专业的学生可以逐步提高自己的算法能力,并为进入互联网公司或其他相关领域打下坚实的基础。

链表问题

问题解决方案
找到链表中倒数第n个节点。nthToLastNode.cpp , nth_to_last_node.py
添加数字,其中数字的每个数字都由链表的节点表示。以链接列表的形式给出输出。add_two_numbers_lists.cpp , add_two_numbers_list.py
交换链表的节点而不交换数据。swapNodesWithoutSwappingData.cpp、swap_nodes_without_swapping_data.py
以迭代和递归方式反转链表verseLinkedListIterAndRecurse.cpp、reverse_linkedlist.py
给定一个链表,反转备用节点并在末尾追加。反向替代节点.cpp
仅给定一个节点指针,从链表中删除该节点。删除节点.cpp
删除整个链表。删除链表.cpp
打印链表的中间节点而不迭代两次。打印MiddleNode.cpp
确定链表是否是回文。listPallindrome.cpp
将数据插入已排序的链表中。insertInASortedLinkedList.cpp
确定两个给定链表的交集(合并)点。findIntersectionPointOfLists.cpp,intersection_of_lists.py
克隆一个具有 next 和一个随机指针的链表,空间复杂度 - O(1)。cloneListWithRandomPtr.cpp、clone_list_with_random_ptr.py
给定一个包含重复项的排序链表,在一次迭代中删除重复项。从排序列表中删除重复项.cpp
使用Floyd的环路查找算法,检测链表是否包含环路,如果包含环路,则删除环路floyedCycleDetection.cpp
使用归并排序对链表进行排序merge_sort.cpp
给定一个单链表 L 0 -> L 1 -> … -> L n-1 -> L n。重新排列列表中的节点(就地),使新形成的列表为:L 0 -> L n -> L 1 -> L n-1 -> L 2 -> L n-2 ....重新排列列表.cpp

包括

Include 包含数据结构和一些算法的单个标头实现。

数据结构/算法执行
通用宏和算法,如交换、随机数生成通用.h
通用堆栈实现堆栈.h
通用队列实现队列.h
通用列表实施列表.h
二叉搜索树的实现二叉搜索树.h
快速排序的实现快速排序.h
归并排序的实现合并排序.h
选择排序的实现选择排序.h
冒泡排序的实现冒泡排序.h
Linux内核双链表实现双链表.h
通用图实现(邻接表)图.h
堆排序的实现堆排序.h
我自己的字符串库实现pstring.h pstring.cpp

位操作问题

问题解决方案
判断一个数是否是2的幂。power_of_2.cpp
添加两个表示为字符串的二进制数。addBin.cpp
确定给定数字的下一个 2 的幂。next_power_of_2.cpp
使用位操作确定数字是否是 3 的倍数。multiple_of_3.cpp
确定机器的字节顺序,以相反的字节顺序打印一个数字。反向字节序.cpp
求给定数的奇偶性。查找奇偶校验.cpp
使用位操作实现数字与 7 的快速乘法。乘以7.cpp
反转无符号整数的位(两种方法 - 逐位反转和分而治之)。整数的反向位.cpp
用于确定给定整数中最右边设置位的位置的小函数。right_most_set_bit.cpp
给定一个数字向量,只有一个数字出现奇数次,求该数字。find_odd_one_out.cpp
给定两个整数,确定它们的和是否会整数溢出。整数溢出.cpp
将数字 A 转换为 B 需要多少位翻转操作。countNumberOfBitFlips.cpp
给定数字 x 和 x 的二进制表示形式的两个位置(从右侧开始),编写一个函数,在给定的两个位置处交换 n 个右位并返回结果。还假设两组比特不重叠。交换位集.cpp
不使用任何算术运算符将两个数字相加addition_without_operators.cpp
路易丝和理查德玩游戏。他们将计数器设置为 N。路易丝获得第一个回合,此后回合交替。在游戏中,他们执行以下操作:
  • 如果 N 不是 2 的幂,则将计数器减少小于 N 的最大 2 的幂。

  • 如果 N 是 2 的幂,则将计数器减少 N 的一半。

得到的值就是新的N,再次用于后续操作。当计数器减到1时,即N==1,游戏结束,最后做出有效动作的人获胜。
  • 给定 N,你的任务是找到游戏的获胜者。如果他们设置的数字为 1,则理查德获胜,因为轮到路易丝了,而她无法采取行动。

  • 输入格式:- 第一行包含一个整数 T,测试用例的数量。T 线如下。每行包含 N,即计数器中设置的初始数字。

计数器游戏.cpp
确定两个整数是否符号相反。check_opposite_signs.cpp
交换给定整数的位置 p 和 q 处的两位。交换位.cpp
检查一个数是否是4的幂。check_if_power_of_4.cpp

破解编码面试问题

问题解决方案
问题 1-1:第 6 版:编写一个算法来确定字符串是否具有唯一字符。我们可以在不使用额外数据结构的情况下做到这一点吗?1-1-hasUniqueChars.cpp , 1-1-hasUniqueChars.py
问题 1-2:第 5 版:当您传递一个以 null 结尾的 C 字符串时,反转字符串。1-2-edi5-reverseString.cpp
问题 1-2:第 6 版:给定两个字符串,确定一个字符串是否是另一个字符串的排列。1-2-perm-strings.cpp , 1-2-perm-strings.py
问题 1-3:第 5 版:编写一个算法来删除字符串中的重复字符。1-3-edi5-removeDuplicates.cpp
问题 1-3:第 6 版:URLify:将字符串中的所有空格替换为“%20”。最好就地1-3-URLify.cpp
问题 1-4:第 6 版:给定一个字符串,编写一个函数来检查它是否是回文排列。1-4-回文排列.cpp
问题 1-5:第 6 版:可以对字符串执行三种可能的编辑 - 插入字符、删除字符、替换字符。给定两个字符串,确定它们是 1 编辑还是 0 编辑。1-5-one-edit-away.cpp
问题 1-6:实现一种执行基本字符串压缩的方法。示例字符串aabcccccaaa应压缩为a2b1c5a3,但是如果压缩字符串大于原始字符串,则返回原始字符串1-6-字符串压缩.cpp
问题1-7:将矩阵顺时针(&逆时针)旋转90度1-7-矩阵旋转.cpp
问题 1-8:编写一个算法,如果 MxN 矩阵的某个元素为 0,则其整个行和列都设置为 0。1-8-零矩阵.cpp
问题 1-9:给定两个字符串 s1 和 s2,只需调用一个函数来确定 s2 是 s1 的旋转,该函数检查一个字符串是否是另一个字符串的旋转。1-9-字符串旋转.cpp
问题 2-1:从未排序的链表中删除重复项。如果不允许临时缓冲区怎么办?2-1-删除-dups.cpp
问题 2-2:从单链表的最后一个节点确定第 k个节点。(迭代和递归方法)2-2-kthToLast.cpp
问题2-3:实现删除单链表中间节点的算法2-3-删除-中间节点.cpp
问题 2-4:围绕值 x 划分链表,所有小于 x 的节点都位于所有大于等于 x 的节点之前2-4-分区.cpp
问题 2-5:有两个由链表表示的数字,其中每个节点包含一个数字。这些数字以相反的顺序存储,使得 1 的数字位于列表的开头。编写一个函数,将两个数字相加并以链表形式返回总和。示例:
  • 输入:( 7 --> 1 --> 6 ) + ( 5 --> 9 --> 2 ) 即 617 + 295

  • 输出:( 2 --> 1 --> 9 ) 即 912。

  • FOLLOW UP :假设列表按正序存储,重复上述问题。

  • 输入:( 6 --> 1 --> 7 ) + ( 2 --> 9 --> 5 ) 即 617 + 295

  • 输出:( 9 --> 1 --> 2 ) 即 912。

  • 递归和迭代地实现它。

2-5-添加列表.cpp
问题2-6:判断链表是否是回文(2次迭代和1次递归方法)2-6-回文.cpp
问题2-7:判断两个单链表是否相交,如果相交,则返回相交节点。交集是根据参考而不是值定义的2-7-交叉点.cpp
问题2-8:检测链表是否有环,找到环的起始节点并去除环2-8-循环检测.cpp

原文链接:

C++ 实现 180 多个算法和数据结构 

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐