题目求解
July yi
这个作者很懒,什么都没留下…
展开
-
力扣 - 622. 设计循环队列
题目要求:题目链接解题思路:任何数据结构中都不存在环形结构,但是可以使用一维 数组 模拟,通过操作数组的索引构建一个 虚拟 的环。很多复杂数据结构都可以通过数组实现。对于一个固定大小的数组,任何位置都可以是队首为了区分数组的空和满,需要 开辟的数组长度 要比 存放元素个数多一个。判空:return obj->_rear == obj->_front;判满:return obj->_front == (obj->_rear+1)%(obj->_k+1);如图所示:原创 2021-01-11 22:35:14 · 237 阅读 · 0 评论 -
leetcode138 — 复制带随机指针的链表
题目:题目链接思路:1. 遍历原来的链表并拷贝每一个节点,将拷贝节点放在原来节点的下一个,创造出一个旧节点和新节点交错的链表。2. 迭代这个新旧节点交错的链表,并用旧节点的 random 指针去更新对应新节点的 random 指针。3. random 指针已经被赋值给正确的节点, next 指针也需要被正确赋值,以便将新的节点正确链接同时将旧节点重新正确链接。图示如下://如果cur->random不为空,则copyNode->random 为 cur->random-&原创 2021-01-01 11:46:47 · 85 阅读 · 2 评论 -
牛客(删除链表中重复节点)
题目要求:题目链接方法:直接删除法在遍历单链表的时候,检查当前节点与下一点是否为相同值,如果相同,继续查找相同值的最大长度,然后指针改变指向。图示:实现代码:class Solution {public: ListNode* deleteDuplication(ListNode* pHead){ //链表为空链表或者只有一个结点,直接返回头节点 if(pHead==NULL || pHead->next==NULL)原创 2021-01-01 10:41:21 · 226 阅读 · 1 评论 -
环形链表
环形链表题目要求:题目链接思路: 假想「乌龟」和「兔子」在链表上移动,「兔子」跑得快,「乌龟」跑得慢。当「乌龟」和「兔子」从链表上的同一个节点开始移动时,如果该链表中没有环,那么「兔子」将一直处于「乌龟」的前方;如果该链表中有环,那么「兔子」会先于「乌龟」进入环,并且一直在环内移动。等到「乌龟」进入环时,由于「兔子」的速度快,它一定会在某个时刻与乌龟相遇,即套了「乌龟」若干圈。我们可以根据上述思路来解决本题。具体地,我们定义两个指针,一快一满。慢指针每次只移动一步,而快指针每次移动两步。初始时,原创 2020-12-25 18:05:41 · 138 阅读 · 1 评论 -
字符串的左旋右旋问题(C语言实现,三种方法求解)
字符串左旋右旋问题其实是同理的,下边以左旋为例:方法一思路:左旋一次就是将整个字符串向左移一个字符,第一个字符(arr[0])移动到最右侧。这样循环操作左旋次数就是最终左旋结果,如上图所示。实现代码:void LeftRotate1(char *arr,int count){ assert(arr); int len = strlen(arr); //左旋count次 while (count--) { //从前往后移动之前先保存arr[0] char temp = arr[0原创 2020-12-20 12:38:48 · 484 阅读 · 2 评论 -
反转链表(图解,易懂)
题目要求:题目链接:点击这里,直接跳转思路:方法1:头插法将链表每个节点依次取下来头插到新链表,即为原链表的反转;因为改变了当前节点的 next 指向,必须先保存 next 地址。图解如下:重复以上步骤:直到终止循环实现代码:struct ListNode* reverseList(struct ListNode* head){ //新链表的头指针 struct ListNode* newhead = NULL; //需要头插的结点 struct Li原创 2020-12-19 11:49:06 · 25091 阅读 · 10 评论 -
求最大公约数(C语言实现)
求最大公约数有多种方法,接下来我对辗转相除法、更相减损法分别做介绍。辗转相除法: gcd(a,b) = gcd(b,a mod b)。假如,需要求 1997 和 615 两个正整数的最大公约数,用辗转相除法,是这样进行的:1997 / 615 = 3 (余 152)615 / 152 = 4(余7)152 / 7 = 21(余5)7 / 5 = 1 (余2)5 / 2 = 2 (余1)2 / 1 = 2 (余0)至此,最大公约数为1以除数和余数反复做除法运算,当余数为 0 时,取当前算式原创 2020-12-17 20:35:48 · 31849 阅读 · 4 评论 -
获取一个整数二进制序列中所有的偶数位和奇数位
思路:我们要分别获得一个二进制序列的奇数偶数位,需要运用位操作运算符我们知道,任何数与1 & 等于原来的任何数(0 & 1 = 0, 1 & 1=1),基于此,我们还需要知道位运算符的左移 (<<) 右移(>>)举例:如图所示接下来,代码实现#include<stdio.h>int main(){ int num = 13; //int占4个字节,32个bit位,i:0-31 int i = 31; printf("%d二进原创 2020-12-17 18:13:54 · 515 阅读 · 0 评论 -
详解-移除链表元素
移除链表元素要求如下:leetcode链接请点击这里方法:哨兵节点如果删除的节点是中间的节点,则问题似乎非常简单:选择要删除节点的前一个结点 prev。将 prev 的 next 设置为要删除结点的 next。当要删除的一个或多个节点位于链表的头部时,事情会变得复杂。可以通过哨兵节点去解决它,哨兵节点广泛应用于树和链表中,如伪头、伪尾、标记等,它们是纯功能的,通常不保存任何数据,其主要目的是使链表标准化,如使链表永不为空、永不无头、简化插入和删除。在这里哨兵节点将被用于伪头。算原创 2020-12-16 20:13:56 · 239 阅读 · 1 评论 -
对链表进行插入排序(图解)
图解 对链表进行插入排序该题目力扣链接点击这里从前往后找插入点插入排序的基本思想是,维护一个有序序列,初始时有序序列只有一个元素,每次将一个新的元素插入到有序序列中,将有序序列的长度增加 1,直到全部元素都加入到有序序列中。如果是 数组 的插入排序,则数组的前面部分是有序序列,每次找到有序序列后面的第一个元素(待插入元素)的插入位置,将有序序列中的插入位置后面的元素都往后移动一位,然后将待插入元素置于插入位置。对于 链表 而言,插入元素时只要更新相邻节点的指针即可,不需要像数组一样将插入位置后原创 2020-12-16 17:00:35 · 9437 阅读 · 9 评论 -
找单身狗(C实现)
题目要求:一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。编写一个函数找出这两个只出现一次的数字。这道题目主要是考察位运算符的应用我们应该知道:相同的两个数字 异或 结果为 0任何数 按位与 1,可以判断最低位是 0 还是 1整体思路:数组所有数字进行 异或 求和,该 异或 求和 结果就是两个只出现一次的数字 异或 结果。我们根据 异或 求和 结果找到 从低位到高位 首次出现 1 的位置 。根据该位置,将两个数字分成两组数字(该位置为 0,该位置为 1),这样他们所在原创 2020-11-22 20:06:23 · 541 阅读 · 3 评论