刷题
文章平均质量分 64
题解析
dong132697
还在学习中,文章中的完整代码可以私聊我,无偿发。
展开
-
另一棵树的子树
依次将树中的每一棵子树都与目标树比较,如果有子树与目标子树相等,则返回true。原创 2023-08-30 16:33:18 · 102 阅读 · 0 评论 -
对称二叉树判断
使用到了判断两棵二叉树是否相等的方法,只不过对称二叉树判断的是p结点的左孩子和q结点的右孩子,p结点的右孩子和q结点的左孩子是否相等。时间复杂度:O(N)空间复杂度:O(N)原创 2023-08-30 16:29:25 · 89 阅读 · 0 评论 -
相同二叉树判断
如果两棵树从根结点一起访问,当有一个结点不相等时就返回false,如果结点都相等就返回true。时间复杂度:O(N)空间复杂度:O(N)原创 2023-08-30 16:23:28 · 206 阅读 · 0 评论 -
单值二叉树
时间复杂度:O(N)空间复杂度:O(N)原创 2023-08-30 16:16:32 · 235 阅读 · 0 评论 -
二叉树的前序遍历
使用递归依次将该结点的数据,该结点的左子树的数据,该结点的右子树的数据都存入数组中,其中函数中i为一个地址,通过解引用这个地址就可以得到i的值,即数组中该第几个下标存值。时间复杂度:O(N)空间复杂度:O(N)原创 2023-08-30 16:10:06 · 239 阅读 · 0 评论 -
二叉树的构建及遍历
按照给出的字符串创建二叉树,先依次访问字符串中的字符,如果遇到不为’#'的字符,就将该结点的值赋值为该字符,然后再创建两个新结点,分别为该结点的左孩子和右孩子,然后递归调用方法,使左孩子和右孩子进行同样操作。如果遇到#字符,就将该结点堆顶值赋值为#,然后直接退出函数,即不再创建该结点的左右孩子结点。和第一种方法相似,都是先按照给出的先序遍历的顺序创建二叉树,然后进行中序遍历。先构建二叉树,再中序遍历。比第一种方法更简洁易懂。原创 2023-08-30 15:34:05 · 400 阅读 · 0 评论 -
设计循环队列
当该情景时判断队列满需要特别处理,此时使用next = tail + 1,用next = head来判断队列是否为满已经不起作用了,所以要判断当next = k + 1时,将next重置为0,然后与head比较来判断队列是否满。使用数组来实现循环队列,设置两个int型变量head和tail用来记录数组中队列的队头和队尾,在申请数组空间时,申请k+1个空间,因为需要多出来一个空间不存储数据,用来判断队列的状态。空间复杂度:O(k),因为循环队列的长度为k,所以要申请k+1个数组元素的空间。原创 2023-08-24 22:40:05 · 232 阅读 · 0 评论 -
用栈实现队列
然后定义一个popstack栈,当有元素出队列时,我们检查popstack栈是否为空,如果为空就将pushstack栈中的元素都加入到popstack栈中。当再需要有元素入队时,直接将元素放入pushstack栈中即可,而有元素出队时就将popstack栈中的元素出栈,当popstack栈为空时,再将pushstack栈中的元素都加入popstack栈中。我们定义一个栈为pushstack,当有元素要进入队列时,都将元素放入这个栈中。时间复杂度:出队时最坏为O(N),入队时为O(1)空间复杂度:O(N)原创 2023-08-24 16:18:27 · 370 阅读 · 0 评论 -
用队列实现栈
用队列实现栈的第一种方法和第二种方法类似,不过一个是在入栈时进行处理,一个是在出栈时处理。而第三种方法只使用了一个队列,在入栈时做处理。原创 2023-08-24 15:15:46 · 131 阅读 · 0 评论 -
复制带随机指针的链表
此时获得一个长度翻倍的链表,并且该链表的原结点的next结点都是新插入的结点,从head开始遍历这个链表,使用curr指针来记录原来结点,然后将curr的下一个结点,即新插入结点的random指向curr结点的random的下一个结点,因为curr的random指向的是原来的结点,所以新结点的random指向的也是新结点。先将原链表的每一个结点后面都新插入一个结点,然后将原链表结点的值都拷贝到原链表结点的下一个结点中去。时间复杂度:O(N^2)空间复杂度:O(N)时间复杂度:O(N)空间复杂度:O(N)原创 2023-08-23 13:50:47 · 78 阅读 · 0 评论 -
环形链表习题
通过第一个方法设置两个快慢指针,可以很容易的判断链表是否带环,然后通过公式的推导,可以得出结论链表头结点到入环口的距离等于快慢指针相遇点绕环n圈后到入环口的距离一致。第二个方法将该题的解法换为了求两个链表的相交点,虽然也可以求出来,但是求出两个指针相遇点后,还需要求两个链表的相交点,程序开销相比于第一个方法大了很多。不过通过这个思路我们还可以在求两个链表相交点时,将链表变为带环的链表,这样只需求入环口就可以得到两个链表的相交点了。原创 2023-08-22 18:26:33 · 57 阅读 · 0 评论 -
相交链表习题
当两个指针指向同一个结点时,说明该结点为两个链表的相交结点,当最后两个指针指向的结点都没有相等时,此时两个指针都指向NULL,就说明两个链表没有相交结点,返回NULL。先算出listA的长度,然后算出listB的长度,判断两个链表哪一个比较长,然后让长的链表先走abs(lenA-lenB),然后再将两个指针一起向后访问链表,并且判断两个指针指向的结点是否相等,如果两个指针指向的结点相同时,此结点就为两个链表的相交结点。时间复杂度:O(N)空间复杂度:O(1)空间复杂度:O(1)空间复杂度:O(1)原创 2023-08-22 14:05:23 · 44 阅读 · 0 评论 -
链表分割习题
我们可以先遍历整个链表,找到链表的尾结点,并且设置一个tialFlage的指针用来表示最原始链表的尾结点,然后再次遍历整个链表,并且将每个结点的值和x的值比较,如果该结点的值大于等于x的值,就将该结点尾插到tail结点之后,并且将tail指针指向该结点,以确保tail始终为链表尾结点。循环结束的条件就是当前的结点是否为最原始链表的尾结点,如果是的话,就说明还差这最后一个结点就遍历了一次最原始的链表,所以在循环结束后,还要单独再执行一次结点处理,将最原始链表的尾结点判断一下是该尾插到链表最后,还是不动。原创 2023-08-22 13:38:12 · 44 阅读 · 0 评论 -
反转链表习题
实现思路和第一种方法基本一致,都是使用三个指针来进行反转,不过该方法更简洁。使用3个指针将链表反转。时间复杂度:O(N)空间复杂度:O(1)时间复杂度:O(N)空间复杂度:O(1)时间复杂度:O(N)空间复杂度:O(N)原创 2023-08-22 12:15:19 · 38 阅读 · 0 评论 -
移除链表元素
先从头遍历单链表,找到第一个值不为val的结点,将该结点设为要返回的结点start。然后再次遍历单链表,通过判断curr的下一个结点的值是否为val,如果是的话,就直接将curr的下一个结点删除。当头结点为要删除的结点时,需要特别处理,即需要将head指针向后移动一位,然后删除原先的头节点。当遍历单链表时,遇到结点的值和val不相等时,就将该结点采用尾插法插入到另一个空的单链表中,当遇到结点的值和val的值相等时,就删除该结点,即释放该结点的空间。空间复杂度:O(1)空间复杂度:O(1)原创 2023-08-21 19:35:49 · 351 阅读 · 0 评论 -
求多数元素
多数在该数组中的数量是大于数组长度的一半的,如果我们假设每个不一样的数字都是一个阵营的士兵,只有一个象征胜利的旗帜,如果另一个阵营的士兵想要将旗帜夺取,则必须要和获得旗帜的阵营的士兵用同归于尽的方法,即双方都一对一同归于尽士兵,到最后哪一个阵营还有士兵,则旗帜就是那个阵营的。所以不管怎样同归于尽,最后旗帜都是在多数阵营中,旗帜在中途可能会被其他数字阵营的士兵夺去,但是多数阵营的士兵数大于其他所有数字阵营的士兵总和,所以最后旗帜还是会被夺取回来。输入:nums = [2,2,1,1,1,2,2]原创 2023-08-11 22:24:23 · 36 阅读 · 0 评论 -
字符个数统计
然后将输入的字符的ASCII码值转为int型作为该字符在数组中的下标,并且将数组中该下标对应的值设为1,字符的个数加1,如果再次遍历到该字符时,查找到该字符的ASCII码值对应下标在数组中的值为1,就不会让字符的个数加1。创建两个数组,一个用来存储输入的字符串,另一个用来存储每个已经出现的字符,先遍历输入的字符串,然后在遍历到每一个字符时,都遍历辅助数组,来查看该字符在辅助数组中是否已经出现,如果没有出现就将该字符加入到辅助数组中,最后辅助数组的长度就为字符种类个数。空间复杂度:O(1)原创 2023-08-11 20:54:44 · 40 阅读 · 0 评论 -
寻找数组的中心下标
先求出数组中所有元素的总和,然后遍历数组,如果i两边的元素之和都为sum,则总和就等于两倍的sum加i下标对应数组的元素。先遍历数组,然后在遍历到每个数组元素时,都再次遍历该元素前的元素并求和,然后遍历该元素之后的元素并求和,最后判断前后元素之和是否相等。左侧数之和 sum = nums[0] + nums[1] + nums[2] = 1 + 7 + 3 = 11 ,数组 中心下标 是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。输入:nums = [1, 7, 3, 6, 5, 6]原创 2023-08-11 20:39:23 · 104 阅读 · 0 评论 -
错误的集合
lowbit=(xor)&(-xor),其中lowbit为x和y的最低不同位,所以则可以用lowbit来区分x和y,即将集合里面的值都与lowbit相与,然后通过lowbit来将集合分为两组,两组集合中的数都相异或,得到的两个结果就是多的数和少的数,此时还不知道哪一个是多的数,可以遍历原集合,哪一个数出现了就是多的数,另一个数就是少的数。将该集合后面再添加1-n个数,则集合里面包含3个多的数,1个缺少的数,将这个集合的所有数字异或,则得到的是多的数和缺少的数的异或结果。输入:nums = [1,1]原创 2023-08-11 19:32:09 · 32 阅读 · 0 评论 -
判断字符串旋转
先实现一个旋转函数,该函数可以将一个字符串左旋k个字符,实现的具体思路是 :如果将AABCD左旋两个字符,我们可以通过先将前两个字符旋转,结果为AA;此时字符串变为AADCB,再将该字符串旋转,结果就为BCDAA,即实现了将字符串左旋两个字符,通过这个思路我们可以实现将给定的s1字符串旋转0~len-1个字符,然后将s1每次旋转后的结果都和s2比较,如果相等则返回1,如果s1选择了0到len-1个字符后都不和s2相等,则返回0。写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。原创 2023-08-11 19:12:39 · 129 阅读 · 0 评论 -
青蛙跳台阶问题
当青蛙第一步只跳一阶,则后面还有两阶需要跳,而跳两阶有两种方法。当青蛙第一步跳两阶,则后面还有一阶,跳一阶只有一种方法。所以跳n阶就等于跳n-1阶加跳n-2阶的跳法。则跳三阶就等于跳两阶的跳法加上跳一阶的跳法。当有一阶台阶时,青蛙跳上去有一种方法。当有两阶台阶时,青蛙跳上去有两种方法。当有三阶台阶时,青蛙跳上去有几种方法?原创 2023-07-30 20:33:24 · 30 阅读 · 1 评论