Skip to content

yuanzhongqiao/algorithms_and_data_structures

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

数据结构和算法问题 Data Structure and Algorithms Problems

alt tag

Current Status Stats
Total C++ Problems 188
Total Python Problems 15
Current Daily Streak 11
Last Streak 06/20/2019 - 06/21/2019
Current Streak 06/23/2019 - 07/03/2019

数据结构与算法问题

替代标签

当前状态 统计数据
C++ 问题总数 188
Python 问题总数 15
当前每日连胜 11
最后的连胜 2019年6月20日 - 2019年6月21日
当前连胜 2019年6月23日 - 2019年3月7日

注意:这里的一些代码是旧的,是我学习 C++ 时编写的。代码可能不安全或做出错误的假设。请谨慎使用。始终欢迎拉取请求。

链表问题

问题 解决方案
找到链表中倒数第n个节点。 nthToLastNode.cpp , nth_to_last_node.py
添加数字,其中数字的每个数字都由链表的节点表示。以链接列表的形式给出输出。 add_two_numbers_lists.cpp , add_two_numbers_list.py
交换链表的节点而不交换数据。 swapNodesWithoutSwappingData.cppswap_nodes_without_swapping_data.py
以迭代和递归方式反转链表 verseLinkedListIterAndRecurse.cppreverse_linkedlist.py
给定一个链表,反转备用节点并在末尾追加。 反向替代节点.cpp
仅给定一个节点指针,从链表中删除该节点。 删除节点.cpp
删除整个链表。 删除链表.cpp
打印链表的中间节点而不迭代两次。 打印MiddleNode.cpp
确定链表是否是回文。 listPallindrome.cpp
将数据插入已排序的链表中。 insertInASortedLinkedList.cpp
确定两个给定链表的交集(合并)点。 findIntersectionPointOfLists.cppintersection_of_lists.py
克隆一个具有 next 和一个随机指针的链表,空间复杂度 - O(1)。 cloneListWithRandomPtr.cppclone_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

动态规划问题

问题 解决方案
使用不同记忆技术的斐波那契第 N 斐波那契.cpp
最长公共子序列问题 lcs.cpp最长的_common_subsequence.py
最大值连续子序列问题wiki 最大子序列.cpp
加泰罗尼亚数 - 计算具有 n 个键的可能二叉搜索树的数量 加泰罗尼亚语号码.cpp
计算 amxn 网格中从源起点 (0, 0) 到目的地 (m-1, n-1) 的唯一路径的数量。您只能向下或向右移动。 唯一路径.cpp
0-1 背包问题:假设你是一个小偷,你想偷东西,房间里装满了东西。您有一个背包,其最大容量为 W,您希望将其装满,使其价值最大。作为一个聪明的小偷,你知道房间里每件物品的重量和价值。你会如何装满你的背包,这样你就可以获得最大可能的价值,这样你只能装满容量W。 0_1_knapsack_problem.cpp

树问题

问题 解决方案
使用队列对树进行迭代级别顺序遍历 levelOrderTraversalIterative.cpp , level_order_tree_traversal_iterative.py
Tree的递归层序遍历 levelOrderTraversalRecursive.cpp , level_order_tree_traversal_recursive.py
树的之字形遍历 zigZagTraversal.cpp , zig_zag_traversal.py
二叉搜索树中给定节点的前驱和后继 前驱后继.cpp
给定二叉搜索树中两个节点的值,找到最低公共祖先(LCA)。假设这两个值都存在于树中。 最低共同祖先.cpp ,最低共同祖先.py
给定一棵二叉树(与二叉搜索树不同),找到最低公共祖先(LCA)。 最低共同祖先二元树.cpp
给定一棵二叉树,每行打印出其所有根到叶路径。 printAllRootToLeafPath.cpp
判断一棵树是否是和树。SumTree 是二叉树,其中节点的值等于其左子树和右子树中存在的节点之和。空树就是SumTree,空树的和可以认为是0。叶子节点也可以认为是SumTree。 sumTree.cpp
将树转换为 sumTree,使得每个节点都是原始树的左子树和右子树的和。 Convert_to_sum_tree.cpp , convert_to_sum_tree.py
将排序数组转换为平衡二叉搜索树。 排序数组到BST.cpp
给定一棵二叉树,生成每个垂直列的总和。 垂直求和.cpp
给定二叉树和键,具有键的节点存在于树中。找到带有key的节点的所有祖先,这里的祖先是从节点到根的直线路径上的节点。 node_ancestors_in_root_path.cpp
给定二叉树和键,返回具有键的节点的级别。根位于第 1 层,如果树中不存在具有键的节点,则返回 0 节点级别.cpp
给定一棵二叉树,找到从根到节点的所有路径,其总和为k。 k_sum_paths.cpp
给定一棵二叉树,以相反的顺序逐层打印其节点。即最后一级的所有节点应首先打印,然后是倒数第二级的节点,依此类推。任何级别的所有节点都应从左到右打印。 反向层序遍历.cpp
以递归和迭代方式反转二叉树。 反转树.cpp
给定一个二叉搜索树,找到其中给定键的 ceil 和 Floor。如果给定的键位于 BST 中,则 Floor 和 ceil 都等于该键,否则 ceil 等于 BST 中的下一个更大的键(如果有),而 Floor 等于 BST 中的上一个更大的键(如果有) Floor_ceil_bst.cpp
查找二叉搜索树中的第 k 个最小元素 kth_smallest.cpp
验证给定的二叉树是否是二叉搜索树。 validate_bst.cpp
给定二叉搜索树和目标数,如果 BST 中存在两个元素且它们的总和等于给定目标,则返回 true。 查找目标k.cpp
给定一个非空二叉搜索树和一个目标值,找到 BST 中最接近目标的值。另外,要注意目标值是浮点数。只有一个最接近目标的唯一值。 最接近的bst_value.cpp最接近的_bst_value.py
给定一棵二叉树,遍历前序,构造一个包含节点值和括号的字符串输出。空节点需要用空括号对“()”表示。并且需要省略所有不影响字符串和原始二叉树之间一对一映射关系的空括号对。代码文件中的示例 string_from_tree.cpp

字符串问题

问题 解决方案
字符串搜索的 Robin-Karp 算法的实现 robinKarpStringMatching.cpp
找到给定字符串的下一个排列,即。重新排列给定的字符串,使其成为按字典顺序大于给定字符串的下一个字符串 next_permutation.cpp
模式匹配Z算法的实现 z.cpp
自建字符串库的测试用例 pstring_test.cpp
获取字符串中最后一个单词的长度。 最后一个单词的长度.cpp
找出两个字符串之间的差异。字符串 t 是通过随机打乱字符串 s 生成的,然后在随机位置再添加一个字母。确定 t 中不同的字符 查找差异.cpp

常见数据结构和逻辑问题

问题 解决方案
以螺旋顺序打印矩阵的内容 矩阵螺旋打印.cpp
给定一个 M x N 矩阵,将其逆时针旋转 R 次,并显示结果矩阵。 旋转矩阵.cpp
将数组旋转 r 个元素(向左或向右) 数组旋转.cpp
给定一个重复/非重复整数数组,确定该数组中的第一个非重复整数 第一个非重复整数.cpp
在Quantumland中,有n个城市,编号从1到n。这里,c i表示第 i城市。Quantumland 有 n−1 条道路。这里,对于每个 i < n,cic i+1之间有一条双向道路。有传言说 Flatland 将攻击 Quantumland,而女王想要保证她的土地安全。如果 c i或c i +1中有警卫,则 c i和 c i+1之间的道路是安全的。女王已经在一些城市安置了一些警卫,但她不确定他们是否足以保证道路安全。她想知道需要雇用的最低数量的新警卫。有关输入/输出详细信息,请参阅解决方案中的注释。 save_quantamland.cpp
给定一个整数 N。找出该数字中恰好能整除 N(余数为 0 的除法)的数字,并显示它们的个数。对于 N=24,有 2 位数字(2 和 4)。这两个数字都可以整除 24。所以我们的答案是 2。请参阅解决方案文件的标头注释中了解更多详细信息。 查找数字.cpp
使用 Caeser Cipher 加密然后解密文本。 caeser_cipher.cpp
使用维吉尼亚密码加密然后解密文本。 vigenere_cipher.cpp
高效生成 1 到 N 之间的二进制数。 n_binary.cpp
实现电源功能 电源函数.cpp

数学问题

问题 解决方案
打印字符串的所有排列。示例:ABC 的排列为 ABC、ACB、BCA、BAC、CAB、CBA 字符串排列.cpp
欧几里得算法找到两个数字的最大公约数。(迭代和递归) gcd.cpp
使用分而治之的方法实现 pow(x,y)。尝试以 O(logn) 实现它 战俘.cpp
计算大数的阶乘,例如 100(它将有 158 位数字) Factorial_of_large_num.cpp
根据在传统移动键盘上输入的数字生成所有可能的单词 电话号码.cpp
给定数字的字符串表示形式,从字符串中删除 n 个字符,以使数字表示形式尽可能最低。 最低可能数.cpp
检测一个数字是否是一个快乐的数字。如果将数字替换为其数字的平方和的一系列运算最终导致 1,则该数字是快乐数字。如果执行上述操作时处于无限循环中,则该数字不是快乐数字。 happy_number.cpp

堆栈问题

问题 解决方案
我们有一系列股票的 n 个每日报价。我们需要计算所有 n 天的股票价格跨度。第 i 天的跨度定义为股票价格小于或等于第 i 天的最大连续天数。对于股票报价 {100, 60, 70, 65, 80, 85},跨度将为 {1, 1, 2, 1, 4, 5}。第 1 天的跨度始终为 1,现在第 2 天的股票价格为 60,并且之前没有一天库存低于 60。因此跨度仍为 1。对于第 3 天,股票定价为 70,因此其跨度是 2,前一天是 60,依此类推。 stock_span_problem.cpp
给定一个中缀表达式,将其转换为后缀表达式,示例 (A+B)*C --> AB+C* 中缀到后缀.cpp
给定一个仅包含字符 '(', ')', '{', '}', '[' 和 ']' 的字符串,确定输入字符串是否有效。括号必须以正确的顺序结束,“( )”和“()[]{}”均有效,但“(]”和“([)]”无效。 有效括号.cpp

排序和搜索问题

问题 解决方案
给定一个排序向量,返回向量中某个值出现的第一个索引,如果数字不存在,则返回 -1 First_occurrence_binary_search.cpp
查找整数数组中的第一个重复元素。给定一个整数数组,找到其中的第一个重复元素。我们需要找到出现多次且首次出现索引最小的元素。 第一个重复元素.cpp
给定一个未排序的整数列表,A={a 1 ,a 2 ,…,a N },找到它们之间绝对差最小的一对元素?如果有多对,则将它们全部找到。 最接近的数字.cpp
给定一个排序数组,确定该数组中固定点的索引。如果数组没有定点,则返回 -1。当元素的索引与索引相同时,数组具有不动点,即 i == arr[i],期望时间复杂度 O(logn) 定点.cpp
求数组中先递增后递减的最大元素。输入:arr[] = {8, 10, 20, 80, 100, 200, 400, 500, 3, 2, 1},输出:500。数组也可以严格递增或递减。预期时间复杂度为 O(logn)。 查找最大值.cpp
给定一个正整数和/或负整数数组,在数组中找到总和最接近 0 的一对。 findClosestPairToZero.cpp
艺术家 Numeros 有两个列表 A 和 B,其中 B 是 A 的排列。Numeros 对这些列表感到非常自豪。不幸的是,在将它们从一个展览运送到另一个展览时,A 中遗漏了一些号码。你能找到丢失的号码吗?笔记:
  • 如果某个数字在列表中多次出现,则必须确保该数字在两个列表中出现的频率相同。如果不是这种情况,那么它也是一个缺失的数字。
  • 您必须按升序打印所有缺失的数字。
  • 将每个缺失的数字打印一次,即使它缺失多次。
  • B 中的最大数与最小数之差小于或等于 100。
  • 将有四行输入: n - 第一个列表的大小,后面跟着 n 个空格分隔的整数,组成第一个列表。m - 第二个列表的大小。接下来是 m 个空格分隔的整数,它们构成了第二个列表。按升序输出缺失的数字。
缺失数字.cpp
从两个排序数组中找到最接近的一对。给定两个排序数组和一个数字 x,找到总和最接近 x 的对,并且该对包含每个数组中的一个元素。给定两个数组 ar1[0…m-1] 和 ar2[0..n-1] 和一个数字 x,我们需要找到一对 ar1[i] + ar2[j],使得 (ar1 [i] + ar2[j] – x) 是最小值。 ClosestPairSorted.cpp
给定一个包含 n 个元素的数组 A,找到三个索引 i、j 和 k,使得 A[i]^2 + A[j]^2 = A[K]^2。O(n2) 时间复杂度和 O(1) 空间复杂度 平方和.cpp
给定一个大小为 n 的未排序数组 arr[0..n-1],找到最小长度子数组 arr[s..e],以便对该子数组进行排序使整个数组排序。 minLengthUnsortedArray.cpp
找出算术级数中缺失的数字 缺失号码2.cpp
找出 3 个排序向量中的公共元素 commonIn3Arrays.cpp
在未排序的数组/向量中查找具有给定总和的所有对 find_pairs_with_sum.cpp
给定一个数组,找到其中的峰值元素。峰值元素是大于其邻居的元素。 峰元素.cpp
给定一个不同非负整数的排序数组,找到其中最小的缺失元素。 最小缺失.cpp
将向量中的所有零移至末尾 move_zeros.cpp

图问题

问题 解决方案
图的深度优先遍历 dfsDemo.cpp
图的广度优先遍历 bfsDemo.cpp
使用 Dijkstra 算法计算从起始位置(节点 S)到图中所有其他节点的最短距离。 dijkstra-最短到达.cpp
使用 Prim 算法计算给定图的最小生成树的总权重(形成 MST 的边的权重之和) primsMST.cpp
使用 Kruskal 算法打印给定图的最小生成树 ( MST )。 克鲁斯卡尔MST.cpp
创建一个程序,为每个字符生成霍夫曼编码作为表格。 哈夫曼编码.cpp
在包含字母的 2D 板上搜索给定单词。可以通过顺序遍历相邻的水平或垂直单元来构造单词。在组成单词的序列中,同一位置上的字母不能使用多次。(查看文件顶部的示例。) grid_word_search.cpp
给定 2D 屏幕、像素的位置和要填充的颜色的新值,用新颜色替换像素的颜色和所有相邻(上、下、左、右)相同颜色的像素。这与 MS-PAINT 中的区域洪水填充(记住桶符号)相同。 洪水填充.cpp

贪心问题

问题 解决方案
给定两个整数数组 A 和 B,每个数组包含 N 个整数。您可以自由排列数组中元素的顺序。A 和 B 是否存在可能的排列 A', B',使得对于所有 i ,A' i +B' i ≥ K,其中 A' i表示数组 A' 中的第 i个元素,B' i表示数组 B' 中的第 i个元素。 两个数组.cpp
约翰正在接受命令。第 i订单是由第 i客户在 t i时间下的,需要 d i时间才能处理。客户收到订单的顺序是什么?(请参阅解决方案评论中的更多详细信息) 订单_订单.cpp

回溯问题

问题 解决方案
您将获得一个数字字符串(例如“1234”、“567”等),根据我们在电话/移动拨号盘上看到的映射,提供我们可以从该数字字符串生成的所有可能的字母组合。如果您在老式手机中输入过短信,您就会知道。例如,“1”映射到“abc”,2 映射到“def”。您可以参考图片
  • 示例:“34”将给出输出:{“dg”,“dh”,“di”,“eg”,“eh”,“ei”,“fg”,“fh”,“fi”}
请注意,结果集中的顺序并不重要。
dialpad_combinations.cpp
实现通配符模式处理并支持“?” &' '。
  • '?' 匹配任何单个字符。
  • ' ' 匹配任何字符序列。
。查看文件中的示例以了解更多详细信息。
通配符匹配.cpp
给定一个 2D 棋盘和字典中的单词列表,从列表中找到棋盘上所有可能的单词。(检查解决方案中的示例) word_search.cpp

Leet代码问题

问题 解决方案
给定一个没有重复项的排序整数数组,返回其范围的摘要。例如,给定 [0,1,2,4,5,7],返回 ["0->2","4->5","7"]。 摘要_范围.cpp
给定一个二维矩阵,具有以下属性
  • 每行中的整数从左到右升序排序。
  • 每列中的整数从上到下按升序排序。
搜索2DII.cpp
给定一个未排序的整数数组,找到第一个缺失的正整数。示例:[1,2,0] 应返回 3,[3,4,-1,1] 应返回 2。预期时间复杂度 O(n) 且解决方案应使用恒定空间 第一个缺失正数.cpp
给定一个未排序的整数数组,找到最长连续元素序列的长度。例如:给定 [100, 4, 200, 1, 3, 2]。最长的连续元素序列是[1,2,3,4]。返回其长度:4。算法应以 O(n) 复杂度运行。 最长连续Seq.cpp
给定两个排序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 作为一个排序数组。您可以假设 nums1 有足够的空间(大小大于或等于 m + n)来容纳 nums2 中的其他元素。nums1和nums2中初始化的元素数量分别为m和n。 合并数组.cpp
给定一个非负整数数组,您最初位于数组的第一个索引处。数组中的每个元素代表您在该位置的最大跳跃长度。确定您是否能够到达最后一个索引。例如:
  • A = [2,3,1,1,4],返回 true。
  • A = [3,2,1,0,4],返回 false。
跳跃游戏.cpp
给定一个正整数,返回 Excel 工作表中显示的相应列标题。例如 1 -> A、2 -> B、...26 -> Z、27 -> AA、28 -> AB、...705 -> AAC excelColSheetTitle.cpp
给定一个数组 nums,编写一个函数将所有 0 移至其末尾,同时保持非零元素的相对顺序。例如,给定 nums = [0, 1, 0, 3, 12],调用函数后,nums 应为 [1, 3, 12, 0, 0]。 moveZeroes.cpp
给定一个整数数组,查找该数组是否包含任何重复项。如果任何值在数组中至少出现两次,函数应返回 true;如果每个元素都不同,则函数应返回 false。 包含重复的.cpp
给定一个列表,将列表向右旋转 k 个位置,其中 k 为非负数。例如:
  • 给定 1->2->3->4->5->NULL 且 k = 2,返回 4->5->1->2->3->NULL
旋转列表.cpp
给定两个单词 word1 和 word2,找到将 word1 转换为 word2 所需的最少步骤数。(每次操作计为1步。)。允许对单词进行以下 3 种操作:
  • 插入一个字符
  • 删除一个字符。
  • 替换一个字符
编辑距离.cpp
给定一棵二叉树,填充每个下一个指针以指向其下一个右侧节点。如果没有下一个右节点,则下一个指针应设置为 NULL。最初,所有下一个指针都设置为 NULL。您只能使用恒定的额外空间。您可以假设它是一个完美的二叉树(即,所有叶子都在同一级别,并且每个父节点都有两个子节点)。 连接下一个指针.cpp
给定 n 对括号,编写一个函数来生成格式正确的括号的所有组合。例如,给定 n = 3,解集为“((()))”、“(()())”、“(())()”、“()(())”、“( )()()" 生成括号.cpp
给定一个包含从 0, 1, 2, ..., n 中选取的 n 个不同数字的数组,找到该数组中缺少的一个。例如,给定 nums = [0, 1, 3] 返回 2。 失踪号码.cpp
假设已排序的数组在您事先未知的某个枢轴处旋转。(即,0 1 2 4 5 6 7 可能变为 4 5 6 7 0 1 2)。求最小元素。您可以假设数组中不存在重复项。 find_min_rotated.cpp
给定一个包含 n 个整数的数组 S,在 S 中找到三个整数,使得总和最接近给定数字 target。返回三个整数的总和。您可以假设每个输入都有一个解决方案。 ThreeSumClosest.cpp
给定 n 个非负整数 a 1 , a 2 , ..., a n,其中每个表示坐标 (i, a i ) 处的一个点。绘制 n 条垂直线,使得线 i 的两个端点位于 (i, a i ) 和 (i, 0) 处。找到两条线,它们与 x 轴一起形成一个容器,使得该容器包含最多的水。注意:容器不得倾斜。 最大面积.cpp
给定一个仅包含 0-9 数字的二叉树,每个根到叶路径都可以代表一个数字。一个例子是根到叶子路径 1->2->3,它代表数字 123。求所有根到叶子数字的总和。解决方案评论中的示例 sumRootToLeafNumbers.cpp
假设您有一个数组,其中第 i 个元素是给定股票在第 i 天的价格。如果您最多只被允许完成一笔交易(即买入一股并卖出一股股票),请设计一种算法来找到最大利润。 最大利润股票.cpp
给定充满非负数的 amxn 网格,找到一条从左上角到右下角的路径,该路径最小化沿其路径的所有数字的总和。注意:在任何时间点您只能向下或向右移动。 最小路径.cpp
计算小于非负数 n 的素数的数量。 质数计数.cpp
假设只能使用从 1 到 9 的数字,并且每个组合都应该是一组唯一的数字,请找出 k 个数字的所有可能组合,总和为数字 n。确保集合中的数字按升序排序。示例:对于 k = 3, n = 9 结果将是 [[1,2,6], [1,3,5], [2,3,4]],类似地对于 k = 3, n = 7,结果将是[[1,2,4]]。 组合Sum3.cpp
给定一个非负整数 num,重复将其所有数字相加,直到结果只有一位数字。例如:给定 num = 38,过程如下:3 + 8 = 11, 1 + 1 = 2。由于 2 只有一位数字,因此返回它。跟进:你能在 O(1) 运行时中不使用任何循环/递归来完成它吗? 添加数字.cpp
给定一个单元格值为 0 或 1 的矩阵。找到从 (a1, b1) 到 (a2, b2) 的最短路径的长度,这样路径只能通过值为 1 的单元格构建,并且只能在 4 中行驶可能的方向,即左、右、上、下。 最短路径迷宫.cpp
两个整数之间的汉明距离是对应位不同的位置的数量。给定两个整数 x 和 y,计算汉明距离。 汉明距离.cpp
给定两棵二叉树,想象一下,当您将其中一棵树覆盖另一棵时,两棵树的某些节点重叠,而其他节点则不重叠。您需要将它们合并到一个新的二叉树中。合并规则是,如果两个节点重叠,则将节点值相加作为合并节点的新值。否则,NOT null 节点将被用作新树的节点。 merge_trees.cpp
编写一个函数,将字符串作为输入并仅反转字符串的元音。 反向元音.cpp
给定一个字符串,根据字符出现的频率将其按降序排序。例如:
  • 输入:cccbbbbbaa 输出:bbbcccaa
按频率排序Char.cpp
除 Self 之外的数组的乘积。给定一个由 n 个整数组成的数组,其中 n > 1,nums,返回一个数组输出,使得 output[i] 等于 nums 中除 nums[i] 之外的所有元素的乘积。 产品_例外_自我.cpp
给定一个已排序的数组,就地删除重复项并返回新的长度。数组中超出唯一元素大小的内容并不重要。预期 O(1) 空间复杂度和 O(n) 时间复杂度。 删除重复项.cpp
计算网格中岛屿的数量。给定一个网格,1表示陆地,0表示水体,确定岛屿的数量(更多详细信息请参见问题评论) 岛屿计数.cpp
从数据流中查找中位数。设计一个数据结构,支持 addNum 将数字添加到流中,并 findMedian 返回目前为止看到的当前数字的中位数。另外,如果数字个数为偶数,则返回中间两个元素的平均值,否则返回中位数。 中值流.cpp
删除最少数量的无效括号以使输入字符串有效。返回所有可能的结果。注意:输入字符串可能包含除括号 ( 和 ) 之外的字母 删除_无效_括号.cpp
给定一个数组和一个值,就地删除该值的所有实例并返回新的长度。不要为另一个数组分配额外的空间,必须通过使用 O(1) 额外内存就地修改输入数组来完成此操作。元素的顺序可以更改。在新长度之外留下什么并不重要。 删除元素.cpp
找到两个数组/向量的交集,给定两个向量找到它们相互作用的结果。结果应仅包含唯一字符并且可以按任何顺序 数组的交集.cpp
给定一个模式和一个字符串 str,查找 str 是否遵循相同的模式。这里follow表示完全匹配,即pattern中的字母和str中的非空单词之间存在双射。例子:
模式=“abba”,str=“狗猫猫狗”应该返回true。
pattern =“abba”,str =“狗猫猫鱼”应该返回 false。
模式=“aaaa”,str=“狗猫猫狗”应该返回false。
pattern =“abba”,str =“dogdogdogdog”应该返回 false。 word_pattern.cpp
为您提供了一个数字向量,其中每个数字代表
股票第 i 天的价格。如果您被允许只完成
每天一笔交易(即买入一只股票并卖出一只股票),设计
寻找最大利润的算法。 最佳购买时间.cpp
给定一个句子,反转句子中每个单词中的字符顺序,同时仍然保留空格和初始单词顺序。
例子:
输入:她喜欢巧克力
输出:ehs sevol etalochoc 反向单词.cpp

About

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

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • C++ 95.7%
  • Python 3.2%
  • Other 1.1%