- 博客(40)
- 收藏
- 关注
原创 Offer60:n个骰子的点数
就能求出每个点数出现的概率了。我们可以用两个数组来存储骰子点数的每个总数出现的次数。在一轮循环中,第一个数组中的第n个数字表示骰子和为n出现的次数,在下一轮循环中,我们加上一个新的骰子,此时和为n的骰子出现的次数应该等于上一轮循环中骰子点数和为n-1、n-2、n-3、n-4、n-5、n-6的次数的总和。要解决这个问题,我们需要先统计出每个点数出现的次数,然后把每个点数出现的次数除以。
2024-09-23 19:04:20 307
原创 Offer56(二):数组中唯一只出现一次的数字,其他数字都出现三次
运算中我们可以把数组中所有的数字的二进制表示的每一位都加起来,如果某一位加起来的和能被3整除,那么那个只出现一次的数字二进制表示中对应的这一位是0,否则是1。我们可以用位运算的思路考虑该问题。
2024-09-23 16:04:22 243
原创 Offer56:数组中数字出现的次数
我们可以从头到尾依次异或数组中的数字,那么所有出现两次的数字的异或结果都为0,最终的结果刚好是那个只出现一次的数字。对于本题也可用相同的思路,如果将数组中的数字全部异或,最终得到的数字肯定不为0,因为要求得的两个数字不相同。这样我们可知a和b的第n位有一个是0,另一个是1,那么我们可以把这个数组中的所有数字以它们的二进制表示的第n位为标准,分成两类;一类它们的第n位数字为0,另一类它们的第n位数字为1。这样就可以将同一个数组中求两个不同数字的问题转化为在一个数组中求一个不同数字的这样一个更简单的问题了。
2024-09-23 15:34:27 204
原创 offer题目51:数组中的逆序对
具体地对于计算统计两个子数组的逆序对的个数,我们用两个指针分别指向两个子数组的末尾,并每次比较两个指针指向的数字,如果第一个子数组中的数字大于第二个子数组中的数字,则构成逆序对,并且逆序对的数目等于第二个子数组中剩余数字的个数。输入一个数组,求出这个数组中的逆序对的总数。分析:可以用类似归并排序的思想,将数组二分,直到数组中只有一个元素时,此时数组逆序数组个数为0,然后开始合并数组,分别统计两个合并数组中逆序对的个数,这样自底向上地完成数组的排序及逆序对的统计,实际上是和归并排序是相同的方法。
2024-07-20 20:24:37 218
原创 offer题目45:把数组排成最小的数
要确定排序规则,就要比较两个数字,给出两个数字m和n,我们需要确定这两个数字拼接后的数字mn和nm的大小。如果mn<nm,那么就该打印出mn,也就是m应该在n前面。另外拼接起来的数字可能很大,无法用现有的数字类型存储,可以所数字转换成字符串,比较它们大小只需要按照 字符串大小的比较规则就可以了。问题描述:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接了出的所有数字中的最小的一个。例如,输入数组{3,32,321},则 打印这3个数字能排成的最小数字321323。
2024-07-16 17:00:54 95
原创 offer题目41:数据流中的中位数
整个容器可以被分为两个部分,位于容器左边的部分的数据比右边的数据小。向堆中插入一个数据的时间复杂度为O(logn),而取堆顶数据的时间复杂度为O(1)。分析:数据是从数据流中读出来的,它的数目随着时间的变化而增加。如果用一个容器来保存从数据流中读出来的数据,则当有新的数据从流中读出来时,这些数据就插入数据容器。可以考虑用数组来作为保存数据的容器,在已经排序好的数组中找出中位数的操作需要O(1)的时间复杂度,而向数组中来插入一个数据的时间复杂度为O(n)。题目描述:如何得到一个数据流中的中位数?
2024-07-12 19:35:57 195
原创 offer题目33:判断是否是二叉搜索树的后序遍历序列
例如,输入数组{5,7,6,9,11,10,8},则返回true,,因为这个整数是下图二叉搜索树的后序遍历结果,如果输入的数组是{7,4,6,5},则由于没有哪棵二叉搜索树的后序遍历结果是这个序列,因此返加false。分析:后序遍历得到的序列,最后一个数字是树的根节点的值。数组中前面的数字可以分为两部分:第一部分是左子树节点的值,它们都比根节点的值小;若二叉搜索树的左子树不为空,则其左子树上所有点的附加权值均小于其根节点的值。若二叉搜索树的右子树不为空,则其右子树上所有点的附加权值均大于其根节点的值。
2024-07-09 21:52:29 239
原创 Offer150-23:链表中环的入口节点
开始我们判断链表中是否存在环路时,定义了两个指针,当快慢指针重合时,说明两个指针都在环中,链表中存在环路。这时,让一个指针再在环路里走一圈,同时统计它走过的步数,直到它再次回到出发位置,这时我们就可以得到整个环路中节点的数量n的大小。第二步是找到环的入口。如果链表中的环有n个节点,则指针P1先在链表上向前移动n步,然后两个指针再以相同的速度向前移动。当P2指向环的入口节点时,P1也已经围绕着环走了一圈又回到了环的入口节点处。定义两个指针,同时从链表的头节点出发,一个指针一次走一步,另一个指针一次走两步。
2024-07-08 12:50:51 231
原创 利用级数公式计算圆周率(π)
具体的,用两个字符数组x,z分别存放当前计算得到的pi值,数组的每一位存放一位数字,然后设定循环,从左向右分别计算pi级数中的每一项。π是是指圆的周长与直径的比值,是无限不循环小数,有很多种方法可以求得它的近似值。这里用比较容易实现的关于π的无穷级数来求它的前10000位的取值。
2024-07-06 20:00:38 739
原创 offer150-20:表示数值的字符串
如果遇到'e'或都'E',则开始扫描表示数值指数的C部分。分析:表示数值的字符串遵循模式A[.[B]][e|EC]或者.B[e|EC],其中A为数值的整数部分,B紧跟着小数点为数值的小数部分,C紧跟着'e'或都'E'为数值的指数部分。在小数里可能没有数值的整数部分,因此A部分不是必需的。如果A为空,那么B不能为空。例如,字符串"+100"、"5e2"、"-123"、"3.1415"及"-1E-16"都表示数值,但"12e"、"1a3.14"、"1.2.3"、"+-5"及"12e+5.4"都不是。
2024-07-05 15:38:59 236
原创 offer150-19:正则表达式匹配
第二种选择是当模式中的第一个字符和字符串中的第一个字符相匹配,则在字符串上向后移动一个字符,而在模式上又有两种选择:可以在模式上向后移动两个字符(表示已匹配完成),也可以保持不变(表示未匹配完成,还需匹配)。如果模式中的字符不是 '.' ,而有具体的某个字符,且与字符串中的当前字符相同,那么它们相互匹配。当模式中的第二个字符不是' * '时,只要比较字符串中的第一个字符是否和模式中的第一个字符相匹配,如果相匹配,那么字符串和模式上都向后移动一个字符,如果不匹配,则直接返回false。
2024-07-04 10:29:58 418
原创 offer150-18:删除链表中的重复节点
分析: 解决这个问题的第一步是确定删除函数的参数,这个函数需要输入待删除链表的头节点,而头节点也可能与后面的节点重复,也就是说删除函数需声明为void deleteDuplication(ListNode** pHead),而不是void deleteDuplication(ListNode* pHead)。接下来需从头遍历整个链表,用pNode记录当前节点,pPreNode记录,当前节点的前一个结点(和当前节点的值不重复)。问题描述:在一个排序的链表中,如何删除重复的节点?
2024-07-04 09:32:15 212
原创 offer150-16:数值的整数次方
分析,题目要求实现库函数pow(),由于不需要考虑大数问题,不必担心溢出,那么就需要对输入的各种情况进行分类处理。当输入base == 0 或 base == 1时它们的任意次方都等于其本身;当输入exponent < 0 时,题目描述:实现函数double Power(double base,int exponent),求base 的exponent次方。不得使用库函数,同时不需要考虑大数问题。然后可以用快速幂求整数的次方。当exponent == 0时,
2024-07-03 17:07:49 128
原创 offer150-9:用两个栈实现队列
队列是先进先出的数据结构,栈是后进先出的数据结构,用两个栈来模拟队列,可以用一个栈来存放进入元素,也就是说,这个栈来进行appendTail()操作;用另一个栈来弹出元素,即用来进行deleteHead()操作,当两个栈都为空时,队列为空。题目描述:用两个栈实现一个队列。队列的声明如下,请实现它的两个方法,appendTail和deleteHead,分别完成在队列尾部插入节点的在队列头部删除节点的功能。
2024-07-03 11:12:04 109
原创 offer7.重建二叉树
解题思路:前序遍历中的第一个数字即为根节点的值,二叉树节点的值各不相同,那么可以扫描中序遍历数组中找到根节点值所在下标位置。又根据中序遍历的特点,在根节点左边的所有数值为根节点的左子树,在根节点右边的所有数值为根节点的右子树。或以得到根节点左右子树中序遍历和先序遍历两个子数组,然后可以递归重建它的左右子树,最后完成整棵二叉树的重建。例如,输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建如下图所示的二叉树并输出它的头节点。
2024-07-02 15:17:54 279
原创 Qt中QCheckBox的三种状态设置
状态:partiallyChecked对应qss中的indeterminate 伪状态。状态:unchecked。首先启用QCheckbox的tristate属性。状态:checked。
2024-03-13 12:39:53 1053
原创 C++浮点数保留n位小数(保留n位精度)
例:TruncRealNum()模板函数 对实数进行截断保留n位小数。输入: double d = 3.14159265358979;输出: d = TruncRealNum(d,5);例子: main函数。
2024-03-06 11:13:11 577
原创 【Qt笔记】QSS中常见的伪状态
QSS中常见的伪状态伪状态描述:active当组件处于一个活动的窗口时,此状态为真:adjoins-itemQTreeView::brance与一个条目相邻时,此状态为真::alternate当QAbstractItemView的alternatingRowColors属性为true,绘制交替的行时此状态为真:bottom组件处于底部,例如QTabBar的表头位于底部:checked组件被勾选,例如QAbstractButton的checked属性为t
2024-02-17 11:01:01 544
原创 【Qt笔记】QSS中常用的子控件
QSS中常用的子控件子控件名称说明::branchQTreeView的分支指示器::chunkQProgressBar的进度显示块::close-buttonQDockWidgte或QTabBar页面的关闭按钮::down-arrowQComboBox、QHeaderView(排序指示器)、QScrollBar或QSpinBox的下拉箭头::down-buttonQScrollBar或QSpinBox的向下按钮::float-buttonQCo
2024-02-17 09:59:27 730
原创 核对表:循环CHECKLIST:Loops
核对表:循环CHECKLIST:Loops循环的选择和创建 在合适的情况下用while循环取代for循环了吗? 循环是由内到外创建的吗?进入循环 是从循环头部进入的循环吗? 初始化代码是直接位于循环前面吗? 循环是无限循环或者事件循环吗?它的结构是否清晰? 避免使用像for i = 1 to 99999这样的代码吗? 如果这是一个C++、C或者Java中的for循环,那么把循环头留给循环控制代码了吗?循环的内部 循环是否用了“{}”或其等价物来括上循环体,以防止因修改不当而出
2024-01-29 16:29:25 304
原创 核对表:使用条件语句CHECKLIST:Using Conditionals
核对表:使用条件语句CHECKLIST:Using Conditionalsif-then语句 代码的正常路径清晰吗? if-then 测试对等量分支的处理方式正确吗? 确保不要用“>”代替“>=”或用“<”代替“<=”。 使用了else子句并加以说明吗? else子句用得对吗? 用对了if和else子句吗,即没把它们用反吗? 需要执行的正常情况是位于if而不是else子句里吗?if-then-else语句串 把复杂的判断封装到布尔函数调用里了吗? 先判断最
2024-01-29 16:12:04 805
原创 核对表:基本数据类型CHECKLIST:Fundmental Data
核对表:基本数据类型CHECKLIST:Fundmental Data数值概论 代码中避免使用神秘数值吗? 代码考虑了除零错误吗? 类型转换很明显吗? 如果在一条语句中存在两个不同类型的变量,那么这条语句会像你期望的那样求值吗? 代码避免了混合类型比较吗? 程序编译时没有警告信息吗?整数 使用整数除法的表达式能按预期的那样工作吗? 整数表达式避免整数溢出问题吗?浮点数 代码避免了对数量级和差巨大的数字做加减运算吗? 代码系统地阻止了舍入错误的发生吗? 代码避免对浮点数
2024-01-17 19:48:00 474
原创 Qt6学习笔记:对象树
创建一个QObject对象时若设置一个父对象,它就会被添加到父对象的子对象列表里,一个父对象被删除时,其全部的子对象都会自动删除。用于在对象的子对象中查找可以转换为类型T的子对象,可以指定对象名称,也可以使用正则表达式(QRegularExpression)来匹配对象名称。参数options表示查找方式,默认在子对象中递归查找,也就是会查找子对象的子对象。对于界面上的容器类组件,容器内的所有组件(包括内部的布局组件)都是其子对象。可以通过children()函数来访问组件内的所有的子对象。
2024-01-04 16:11:21 885
原创 Qt6学习笔记:Qt元对象系统MOS(Meta-object system)
构建项目时,MOC会读取C++源文件,当发现类的定义里有Q_OBJECT宏时,它就会为这个类生成另一个包含元对象支持代码的C++源文件,这个生成的源文件连同类的实现文件一起被 标准C++编译器编译和连接。QObject类是所有使用元对象系统的类的基类,也就是说,如果一个类的父类或上层类是QObject,它就可以使用信号与槽、属性等特性。这是类的静态变量,不是函数,存储了类的元对象。按照对象名称,查找可被转换为类型T的子对象。返回符合名称和类型条件的子对象列表。返回这个对象的元对象。返回所有动态属性名称。
2024-01-03 19:05:19 849
原创 核对表:防御式编程CHECKLIST:Defensive Programming
核对表:防御式编程CHECKLIST:Defensive Programming一般事宜 子程序是否保护自己免遭有害输入数据的破坏? 你用断言来说明编程假定吗?其中包括了前条件和后条件吗? 断言是否只是用来说明从不应该发生的情况? 你是否在架构或高层设计中规定了组特定的错误处理技术? 你是否在架构或高层设计中规定了是让错误倾向于健壮性还是正确性? 你是否建立了隔栏来遏制错误可能造成的破坏?是否减少了其他需要关注错误处理的代码的数量? 代码中用到辅助调试的代码了吗? 如果需要启用或禁用添加
2023-12-31 21:25:18 571
原创 核对表:高质量的子程序CHECKLIST:High-Quality Routines
核对表:高质量的子程序CHECKLIST:High-Quality Routines大局事项 创建子程序的理由充分吗? 一个子程序所有适于单独提出的部分是不是已经被提出到单独的子程序中了? 过程的名字中是否用了强烈、清晰的“动词+宾语”词组?函数的名字是否描述了其返回值? 子程序的名字是否描述了它所做的全部事情? 是否给常用的操作建立了命名规则? 子程序是否具有强烈的功能上的内聚性?即它是否做且只做了一件事,并且把它做得很好? 子程序之间是否有较松的耦合?子程序与其他子程序之间的连接是否是
2023-12-29 21:42:35 473
原创 类的质量:核对表CHECKLIST:Class Quality
类的质量:核对表CHECKLIST:Class Quality抽象数据类型 你是否把程序中的类都看做是抽象数据类型了?是否从这个角度评估它们的接口了?抽象 类是否有一个中心目的? 类的命名是否恰当?其名字是否表达了其中心目的? 类的接口是否展现了一致的抽象? 类的接口是否能让人清楚明白地知道该如何用它? 类的接口是否足够抽象,使你能不必顾虑它是如何实现其服务的?你能把类看做黑盒子吗? 类提供的服务是否足够完整,能让其他类无须动用其内部数据? 是否已从类中除去无关信息? 是否考虑过
2023-12-27 18:50:01 397
原创 李毓佩《数学历险记》---裂项法简算分数
计算:11∗2+12∗3+13∗4+ ...+198∗99+199∗100\frac{1}{1 * 2} + \frac{1}{2 * 3}+ \frac{1}{3 *4}+ ...+\frac{1}{98 * 99} + \frac{1}{99 * 100}1∗21+2∗31+3∗41+ ...+98∗991+99∗100111∗2+12∗3+13∗4+ ...+198∗99+199∗100\frac{1}{1 * 2} + \frac{1}{2 * 3}+ \frac{1}{3 *4}+ .
2023-12-24 22:28:24 1148
原创 主要的构建实践核对表
主要的构建实践核对表Checklist:MajorConstructionPractices编码 你有没有确定,多少设计工作将要预先进行,多少设计工作在键盘上进行(在编写代码的同时)? 你有没有规定诸如名称、注释、代码格式等“编码约定”? 你有没有规定特定的由软件架构确定的编码实践,比如如何处理错误条件、如何处理安全性事项、对于类接口有哪些约定、可重用代码遵循哪些标准、在编码时考虑多少性能因素等? 你有没有找到自已在技术浪潮中的位置,并相应调整自己的措施?如果必要,你是否知道如何“深入一种语言去
2023-12-23 16:39:52 324
原创 【无标题】
C++规定了虚函数的行为,但将实现方法留给我编译器作者,通常编译器处理虚函数的方法是,给每个对象添加一具隐藏成员。隐藏成员中保存了一个指向函数地址数组的指针。这种数组称为。虚函数表中存储了为类对象进行声明的虚函数的地址。例如,基类对象包含一个指针,该指针指向基类中所有虚函数的地址表。派生类对象将包含一个指向独立地址表的指针。
2023-12-22 21:53:05 350
原创 架构核对表Checklist:Architecture
以下是一份问题列表,优秀的架构应该关注这些问题。这张核对表的意图并非用做一份有关如何架构的完全指南,而是作为一种实用的评估手段。这张核对表可以用做你自已的核对表的出发点,如果你从事的是非正式项目,那么你会发现其中某些条款甚至都不用去想。如果你从事的是更大型的项目,那么大多数条款都会是很有用的。
2023-12-21 17:15:56 523
原创 需求核对表Checklist:Requirements
这张包含一系列的问题–问问自己项目的需求工作做得如何。在开始构建之前,用这份列表做一次“心智健全”检查。并不是核对表中所有的问题都适用于你的项目。如果你做的是一个非正式项目,那么你会发现有些东西根本就不需要考虑。你还会发现一些问题你需要考虑,但不需要做出正式的回答。如果你在做一个大型的项目,你也许就要逐条考虑了。
2023-12-20 21:35:02 492
原创 李毓佩《数学历险记》———牛吃草问题(牛顿问题)
把10头牛22天吃的总量与16头牛10天吃的总量相比较,得到的10×22-16×10=60,类似于60头牛1天吃的草,平均分到(22-10)天里,便得到5头牛一天吃的草,也就是每天新长出的草。求出了这个条件,把所有头牛分成两部分来研究,用其中一部分(5头)吃掉新长出的草,用另外一部分吃掉原有的草,即可求出全部头牛吃的天数。这片青草供给10头牛吃,可以吃22天,或者供给16头牛吃,可以吃10天,期间一直有草生长。如果可供24头牛吃6天,或者可供20头牛吃10天,那么可供19头牛吃几天?
2023-12-20 15:48:26 1299
原创 Leecode 809.情感丰富的文字 ----双指针
例如,以 "hello" 为例,我们可以对字母组 "o" 扩张得到 "hellooo",但是无法以同样的方法得到 "helloo" 因为字母组 "oo" 长度小于 3。我们将相邻字母都相同的一串字符定义为相同字母组,例如:"h", "eee", "ll", "ooo"。我们不能通过扩张 "helo" 来得到 "heeellooo" 因为 "ll" 的长度小于 3。我们能通过扩张 "hello" 的 "e" 和 "o" 来得到 "heeellooo"。输入一组查询单词,输出其中可扩张的单词数量。
2023-12-17 13:21:34 606
原创 李毓佩 数学历险记 --- 比赛报数
分析: 谋划是指为一件事出谋划策,使效率最高,或者在一种有规则的游戏中,提出取胜对策。依次类推,甲必须先报到179、170、161.......即必须报到第(9*m + 8)个数,m为自然数由0开始。,即公差为9的等差数列的第m项。如果m取从1开始的整数,那么甲应抢先报到第(9 * (m - 1) + 8)即(9*m - 1)个数时(m为整数),可以保证获得胜利。每次报的都是不超过8的自然数,即可以报上一人报的数字加上1~8后的整数,所报的数字逐次增大,看谁正好报到数字188谁就获得胜利。
2023-12-16 22:52:08 490
原创 C++Prime Plus 学习笔记-----在构造函数中使用new的注意事项
具体的说,该方法应完成这些操作:检查自我赋值的情况,释放成员指针以前指向的内存,复制 数据而不仅仅是数据的地址,并返加一个指向调用对象的引用。具体的说,复制构造函数应分配足够的空间来存储复制的数据,并复制数据,而不仅仅是数据的地址,还应该更新所有受影响的静态成员。应当定义一个赋值运算符,通过深度复制将一个对象复制给另一个对象。
2023-12-15 20:33:33 364
原创 C++Plus Prime笔记----名称空间
这样做的目的是减少名称冲突,尤其当程序非常大,并使用多个厂商的代码时。可以通过使用作用域解析运算符、using声明或using编译指令,来使名称空间中的标识符可用。名称空间可以是全局的,也可以位于另一个名称空间中,但不能位于代码块中。因此,在默认情况下,在名称空间中声明的名称的链接性为外部的(除非它引用的常量)。除了用户定义的名称空间外,还存在另一个名称空间------全局名称空间。它对应于文件级声明区域,因此全局变量现在被描述为位于全局名称空间中。使用名称空间的主旨是简化大型编程项目的管理工作。
2023-12-14 21:30:00 375
原创 Leecode刷题笔记---1218.最长定差子序列
输入:arr = [1,5,7,8,5,3,4,2,1], difference = -2。中最长等差子序列的长度,该子序列中相邻元素之间的差等于 difference。输入:arr = [1,2,3,4], difference = 1。输入:arr = [1,3,5,7], difference = 1。子序列 是指在不改变其余元素顺序的情况下,通过删除一些元素或不删除。解释:最长的等差子序列是 [1,2,3,4]。解释:最长的等差子序列是 [7,5,3,1]。解释:最长的等差子序列是任意单个元素。
2023-12-13 09:05:49 630
原创 C++ Prime Plus 笔记 智能指针
以及包含指针的STL容器,很多STL算法都支持复制和赋值操作,这些操作可用于shared_ptr,但不能用于unique_ptr(编译器发出警告)和auto_ptr(行为不确定)。如果函数使用new分配内存,并返回指向该内存的指针,将其返回类型声明为unique_ptr是不错的选择。所有的指针类都有一个explicit构造函数,该构造函数将指针作为参数,因此不会隐式地将普通指针转换为智能指针。示例:演示了三种智能指针的简单用法,其中每个智能指针都放在一个代码块中,离开代码块时,指针将过期。
2023-12-11 16:46:00 351
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人