链表的经典面试题(数据结构详解)+顺序表和链表之间区别+计算机存储体系

前言

首先这里已经正式步入数据结构的知识,之前我们已经讲解了链表的使用,接下来我们需要的就是大量的练习,熟练掌握数据结构。下面的题型我们选择的都是链表的经典题型,面试题型,包含快慢指针,数形结合,链表的证明题型,链表的熟练使用。并且会由简单到相对复杂来进行讲解计算。

面试题:返回倒数第k个节点(简单)

面试题 02.02. 返回倒数第 k 个节点 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/kth-node-from-end-of-list-lcci/description/

这一题是很简单的当做试手题

题目

题目分析

1,这里的思路是利用快慢指针来进行解决

2,这里如果我们需要的是,倒数第2个节点的情况下,我们可以让快指针先移动两次

3,之后再同步进行移动,当快指针指向null的时候,说明慢指针此时指向需要的数值

4,这里需要注意的是,最后的返回值是数值->val,不是地址

代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */

typedef struct ListNode ListNode;
int kthToLast(struct ListNode* head, int k)
{
    ListNode* FAST=head;
    ListNode* SLOW=head;
    while(k--)
    {
        FAST=FAST->next;
    }
    while(FAST)
    {
        SLOW=SLOW->next;
        FAST=FAST->next;
    }
    return SLOW->val;

}

链表回文

链表的回文结构_牛客题霸_牛客网 (nowcoder.com)icon-default.png?t=N7T8https://www.nowcoder.com/practice/d281619e4b3e4a60a2cc66ea32855bfa?tpId=49&&tqId=29370&rp=1&ru=/activity/oj&qru=/ta/2016test/question-ranking

 题目

解决思路

1,先找中间节点

2,然会进行逆置

3,最后进行对比

 1,找到中间节点

这个我们采取快慢指针,来找到中间节点

快慢指针是一种常用的技巧,用于在链表或数组中找到中间节点、检测循环或者解决其他问题。快慢指针通常包括两个指针,一个快指针和一个慢指针。快指针每次移动两个节点,而慢指针每次移动一个节点。当快指针到达链表的末尾时,慢指针将指向链表的中间节点。
下面是快慢指针在链表中找到中间节点的步骤:
1. 初始化两个指针,快指针(fast)和慢指针(slow),都指向链表的头节点。
2. 在每次迭代中,将快指针向前移动两个节点,将慢指针向前移动一个节点。
3. 当快指针到达链表的末尾(即快指针为NULL或者快指针的下一个节点为NULL)时,慢指针将指向链表的中间节点。
如果链表的长度是奇数,慢指针将指向中间的节点;如果链表的长度是偶数,慢指针将指向中间两个节点的第一个节点。
下面是一个使用快慢指针在链表中找到中间节点的示例代码:

```c
ListNode* FindMid(ListNode* head) {
    if (head == NULL || head->next == NULL) {
        return head; // 链表为空或只有一个节点时,中间节点就是头节点
    }
    ListNode* slow = head;
    ListNode* fast = head;
    while (fast != NULL && fast->next != NULL) {
        slow = slow->next;       // 慢指针前进一步
        fast = fast->next->next; // 快指针前进两步
    }
    return slow; // 慢指针指向中间节点
}
```

在这个示例中,当快指针到达链表的末尾时,慢指针将指向链表的中间节点。如果链表有偶数个节点,慢指针将指向第二个中间节点。如果需要找到第一个中间节点,可以在循环结束后将慢指针再向前移动一个节点。

这里的判断条件看清楚,都是对快指针的判断,因为快慢指针涉及的是奇偶数

 while (fast != NULL && fast->next != NULL) 

2,然会进行逆置

逆置这里,不能直接进行逆置,直接进行逆置的情况下,容易导致循环节点,所以需要修改一下,也就是创建一个指针指向头结点

单链表逆置(这里还是有点难度的)

也称为链表翻转,是将链表中的元素顺序颠倒的过程。在单链表中,每个节点都有一个指向下一个节点的指针。逆置链表意味着改变每个节点的指向,使其指向前一个节点,而不是下一个节点。
链表逆置的常用方法是使用头插法。头插法是一种常用的链表操作技巧,用于在链表的头部插入新节点。在链表逆置过程中,我们可以从头开始遍历原始链表,并将每个节点作为新链表的头节点插入。
以下是单链表逆置的步骤:
1. 初始化两个指针,一个指向原始链表的头节点(current),另一个指向新链表的头部(newHead),初始时新链表为空。
2. 遍历原始链表:
   a. 使用临时指针(next)保存当前节点的下一个节点。
   b. 将当前节点的下一个节点指向新链表的头部(newHead),实现头插法。
   c. 更新新链表的头部为当前节点。
   d. 将当前节点移动到下一个节点(即临时指针指向的节点)。
3. 当原始链表遍历完毕后,新链表即为逆置后的链表。
下面是一个使用头插法逆置单链表的示例代码:


ListNode* Reverse(ListNode* head) {
    ListNode* newHead = NULL; // 新链表的头部
    ListNode* current = head; // 当前遍历的节点
    while (current != NULL) {
        ListNode* next = current->next; // 保存下一个节点
        current->next = newHead; // 将当前节点的下一个节点指向新链表的头部
        newHead = current; // 更新新链表的头部为当前节点
        current = next; // 移动当前节点到下一个节点
    }
    return newHead; // 返回新链表的头部
}

在这个示例中,`Reverse` 函数接受一个链表的头节点 `head` 作为参数,并返回逆置后的链表的头节点 `newHead`。通过头插法,原始链表中的每个节点都被逆序插入到新链表的头部,从而实现了链表的逆置。
 

图解

1,首先这里是一个环回链表,我们已经找到了中间节点

2,此时我们设置好变量

3,我们进行逆置的行动

我们不能直接进行逆置,这样的话会导致最后进行对比的时候,产生循环所以我们需要让中间数值的下一个节点指向null,然后再进行下面节点的转化

 3,最后进行对比

也就是,

代码

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};*/
//进行重命名
#include <cstddef>
class PalindromeList {
public:
typedef struct ListNode ListNode;
//找到中间节点
ListNode* FindMid(ListNode* head)
{
    if(head == NULL || head->next == NULL)
    {
        return head;
    }
    ListNode*slow =head;
    ListNode*fast =head;
    //这里的判断判断全部都是奇偶数
    while(fast && fast->next)
    {
        slow=slow->next;
        fast=fast->next->next;
    }
    //返回中间节点
    return slow;
}

//翻转链表
ListNode* Flip(ListNode* mid)
{
    ListNode* newhead = NULL;
    ListNode* cur = mid;
    while (cur) 
    {
        ListNode* next= cur->next;
        //进行头插,不能直接进行链表的翻转,不然会产生回环链表
        cur->next = newhead;
        newhead = cur;
        cur = next;
    }
    return newhead;
}

//进行对比,是回文结构就进行返回bool数值,不是的话返回null
bool chkPalindrome(ListNode* A)
{
    ListNode*mid= FindMid(A);
    ListNode*title=Flip(mid);
    while(A && title)
    {
        if(A->val != title->val)
        {
            return false;
        }
        A = A->next;
        title = title->next;
    }
    return true;
}

};

相交链表

160. 相交链表 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/intersection-of-two-linked-lists/description/

题目

解决思路

1,找到相交的点

相交链表的关键也就是找到相交的点,所以我们需要首先判断有没有相交的节点,没有相交的节点结束返回NULL,有相交的节点继续,此时我们已经算出各自的链表的长度(一次循环)

2,算出长度差值

3,遍历找到节点

最后一步两个节点同时移动,当两个节点的地址等于的时候,此时也就是找到了相交的节点

代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
typedef struct ListNode ListNode;
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB)
{
    //这里的起始节点是1,因为链表场赌博是从1开始计算的
    int contA = 1;
    int contB = 1;

    //进行判断,是不是有相同的尾结点
    ListNode*cureA = headA;
    ListNode*cureB = headB;
    while(cureA)
    {
        cureA = cureA->next;
        //计算A链表的长度
        contA++;
    }
    while(cureB)
    {
        cureB = cureB->next;
        //计算B链表的长度
        contB++;
    }
    if(cureA != cureB)
    {
        return NULL;
    }

    //假设法,假设A长
    //长的先走,直到指向的位置是平行的
    if(contA > contB)
    {
        int contsame = contA-contB;
        while(contsame--)
        {
            headA = headA->next;
        }
    }
    else
    {
        int contsame = contB-contA;
        while(contsame--)
        {
            headB = headB->next;
        }
    }

    //找到交点
    while(headA)
    {
        if(headA == headB)
        {
            return headA;
        }
        headA = headA->next;
        headB = headB->next;
    }
    return NULL;
}

  随机链表的复制

138. 随机链表的复制 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/copy-list-with-random-pointer/description/

 题目

给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。

构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点 

例如,如果原链表中有 X 和 Y 两个节点,其中 X.random --> Y 。那么在复制链表中对应的两个节点 x 和 y ,同样有 x.random --> y 。

返回复制链表的头节点。

用一个由 n 个节点组成的链表来表示输入/输出中的链表。每个节点用一个 [val, random_index] 表示:

  • val:一个表示 Node.val 的整数。
  • random_index:随机指针指向的节点索引(范围从 0 到 n-1);如果不指向任何节点,则为  null 。

你的代码  接受原链表的头节点 head 作为传入参数。

 解题思路和图解

我们看见这个题目的时候首先就是看不懂,有点懵的。其实这都是我们想复杂了、这里你不能来回去追求random指向的节点的哪里,只需要直接进行拷贝就可以

步骤1(考察链表的创建,赋值):

  1. 首先我们需要复制链表节点
  2. 然后我们把赋值的节点里面是数值val放到复制的节点里面,这里是不需要赋值next的,因为你只需要直接进行插入就可以,形成新的长的链表。
  3. 一边复制一边把节点插入到原链表里面形成一个

步骤2(考察链表的逻辑关系):

  1. 此时我们复制val到链表里面并没有复制random也就是随机节点,所以这里我们需要复制随机节点
  2. 首先我们判断这个节点里面的random指向的节点是不是NULL,如果是NULL也就是说明指向空,也就是最后一个节点
  3. 如果不是NULL ,也就是说明,这个节点指向的下一个节点不是NUILL,此时我们需要注意,这里的关键点来了。我们需要让拷贝节点里面的random的地址是原链表的random指向的下一个节点,也就是random的->next,这样我们就达到我们不需要进行指向,直接就把地址拷贝过来。

步骤3(考察链表的插入):

  1. 最后一步,很简单,只需要把链表拷贝的节点和原链表分开
  2. 最后返回新链表的头结点

 代码

/**
 * Definition for a Node.
 * struct Node {
 *     int val;
 *     struct Node *next;
 *     struct Node *random;
 * };
 */
 //这里进行重命名一下,后期使用的时候不需要一直写struct
typedef struct Node Node;
Node* copyRandomList(Node* head) 
{
    //创建节点,复制节点,插入节点
    Node* cur = head;
    while(cur)
    {
        //创建节点,并且进行检验
        Node* copy = (Node*)malloc(sizeof(Node));
        if(copy == NULL)
        {
           perror("copyRandomList:copy:error");
           exit(1);
        }
        //复制数值
        copy->val = cur->val;
        //插入链表(这一步,两个不能交换)
        copy->next = cur->next;
        cur->next = copy;
        //遍历
        cur = copy->next;
    }

    //复制random节点
    cur = head;//cur一移动了重新指向头结点
    while(cur)
    {
        Node* copy = cur->next;//找到copy拷贝节点,这里必须是循环里面的,因为每次都需要改变位置
        if(cur->random == NULL)
        {
            copy->random = NULL;
        }
        else
        {
            copy->random = cur->random->next;
        }
        //遍历
        cur = copy->next;
    }

    //取出需要的节点,返回头结点
    cur = head;//cur一移动了重新指向头结点
    Node* copyhead = NULL;Node* copytile = NULL;//创建头结点和尾结点,不创建哨兵位了
    while(cur)
    {
        //这一步已经完成循环移动了,我们只需要每次移动cur就可以完成整体的移动
        Node* copy = cur->next; 
        Node* pure = copy->next;
        if(copytile == NULL)
        {
            copyhead = copytile = copy;
        }
        else
        {
            //进行尾插
            copytile->next = copy;
            copytile = copytile->next;
        }
        cur = pure;
    }
    //返回新链表头结点
    return copyhead;
}

环形链表(是否成环)(简单)(证明题)

141. 环形链表 - 力扣(LeetCode)

题目

解题思路

1,我们把判断问题,用快慢指针搞成追击问题

代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
 //如果链表中存在环 ,则返回 true 。 否则,返回 false 。
typedef struct ListNode ListNode;
bool hasCycle(struct ListNode *head) 
{
    //快慢指针来解决
    ListNode* slow = head;ListNode* fast = head; 
    while(fast && fast->next)
    {
        slow = slow->next;
        fast = fast->next->next;
        if(fast == slow)
        {
            return true;
        }
    }
    return false;
}

1,为什么一定会相遇,有没有可能错过,永远追不上?请证明(面试题)

一定会相遇

证明:已知这里是一次走两步

所以我们按照快指针一次两步进行推算

已知是快慢指针,所以我们已经从判断问题,变成了追击问题,

2,slow一次走一步,fast一次走3,4,5,6,n步行不行,为什么,请证明

证明:这里我们需要假设是快指针一次走三步

那此时说明3slow==fast

也就是三倍距离

所以我们进行证明

那么此时有两种可能性

第一种也就是当差距为偶数的时候

第二种也就是当差距为奇数的时候

是否存在追不上的情况(证明)

什么情况下会追不上,也就是当第一次循环没有追上,第二次-1依旧是奇数没有追上,那么此时存在追不上的情况,但是这种情况是否存在?接下来我们进行证明。

环形链表(成环的相交的节点在哪)(中等)(证明题)

142. 环形链表 II - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/linked-list-cycle-ii/

题目

解题思路(证明一下)

这里的关键点在于你需要证明L==T

然后就可以解题

代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
 typedef struct ListNode ListNode;
ListNode *detectCycle(ListNode *head) 
{
    ListNode* fast = head;
    ListNode* slow = head;
    while(fast && fast->next)
    {
        fast = fast->next->next;
        slow = slow->next;
        if(fast == slow)
        {
            ListNode* cur = head;
            ListNode* meet = slow;
            while(cur != meet)
            {
                cur = cur->next;
                meet = meet->next;
            }
            return meet;
        }
    }
    return NULL;
}

顺序表和链表之间区别

顺序表和链表是两种基本的数据结构,它们在存储方式和操作特性上有所不同:
1. **存储方式**:
   - **顺序表**:顺序表是连续的内存空间,元素按顺序依次存放。每个元素的地址可以通过首元素地址加上偏移量来直接计算。
   - **链表**:链表中的元素可以分散地存储在内存中,每个元素(节点)包含数据和指向下一个节点的指针。链表的存储是非连续的,节点间通过指针连接。
2. **元素访问**:
   - **顺序表**:可以直接通过索引快速访问任何一个元素,时间复杂度为O(1)。
   - **链表**:访问特定节点需要从头节点开始,按顺序遍历,时间复杂度为O(n)。
3. **插入和删除操作**:
   - **顺序表**:插入或删除元素时,可能需要移动大量元素以保持连续性,时间复杂度为O(n)。
   - **链表**:插入或删除元素只需改变指针,时间复杂度为O(1)(但查找插入位置或删除节点仍需O(n))。
4. **空间利用**:
   - **顺序表**:需要预先分配固定大小的内存空间,可能会造成空间浪费。
   - **链表**:动态分配内存,更灵活地利用空间。
5. **内存分配**:
   - **顺序表**:通常在栈上或通过malloc一次性分配。
   - **链表**:节点在堆上动态分配,通过指针链接。
6. **适用场景**:
   - **顺序表**:适用于频繁随机访问元素的场合。
   - **链表**:适用于频繁插入和删除元素的场合。
两者各有优势,选择哪种数据结构取决于具体应用场景和需求。在实际应用中,还会根据需要衍生出多种链表的变体,如双向链表、循环链表等,以适应不同的应用场景。

 

原地扩容和异地扩容

原地扩容(In-place expansion)和异地扩容(Out-of-place expansion)通常是指在数据结构或存储系统中对容量进行扩展的两种方式。
1. **原地扩容(In-place expansion)**:
   - 这种方式通常指的是在原有的空间内进行扩容,不需要移动数据到新的位置。
   - 例子包括:在数组或内存池中,当需要更多空间时,可以在原有内存地址后追加更多的空间。这种方式可能涉及到复杂的内存管理,因为可能需要重新分配更大的连续内存块,并移动原有数据到新位置。
2. **异地扩容(Out-of-place expansion)**:
   - 异地扩容则是将数据移动到一个新的、更大的空间中,通常是创建一个新的数据结构或存储空间,然后将旧数据复制或迁移到新空间。
   - 例子包括:在链表结构中,可以通过创建新的节点并在新节点中存储更多的数据来实现扩容。在文件系统中,可能需要将文件从一个分区移动到另一个更大的分区。
在具体的技术应用中,原地扩容和异地扩容有其各自的优缺点:
- 原地扩容可能更高效,因为它不需要复制大量数据到新的位置,但可能涉及到复杂的内存管理和潜在的内存碎片问题。
- 异地扩容可能更简单实现,因为它通常涉及到创建新的资源,但数据迁移过程可能会耗费较多时间和资源。
选择哪种扩容方式取决于具体的应用场景、资源限制以及对性能的要求。在设计数据结构和系统时,通常会根据实际需求来决定最合适的扩容策略。

原地扩容和异地扩容

原地扩容

异地扩容

这里不要释放 不管是原地还是异地

如果是原地扩容说明是原来的地址

如果是异地扩容,则不需要手动释放,会主动释放

计算机的存储体系

存在内存里面的时候 不通电是不行的 这里是临时存储的

内存的存储速度比硬盘快

这里是越往下越便宜

eax寄存器

cpu是不会直接访问内存的

因为觉得太慢了

所以一般加载到缓存再访问

然后进行访问

与程序员相关的CPU缓存知识 | 酷 壳 - CoolShellicon-default.png?t=N7T8https://coolshell.cn/articles/20793.html#google_vignette

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/605560.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Isaac Sim 3(学习笔记5.8)

Isaac Sim 利用深度学习获取mask掩码图 参考内容 Kubernetes官网 在 Linux 系统中安装并设置 kubectl | Kubernetes准备开始 kubectl 版本和集群版本之间的差异必须在一个小版本号内。 例如&#xff1a;v1.30 版本的客户端能与 v1.29、 v1.30 和 v1.31 版本的控制面通信。 用…

gocator导出图片

想用3D扫描后的图片&#xff0c;但是系统自带的导出方法很麻烦&#xff0c;所以考虑通过sdk导出 首先需要设置点云亮度 这里是导出图片的关键代码 case GoDataMessageType.SurfaceIntensity: { Debug.WriteLine("SurfaceIntensity "); GoSu…

AI换脸原理(2)——人脸检测参考文献S3FD:源码解析

1 介绍 S3FD是一个实时人脸检测器,这篇论文的主要思想是试图解决一个常见的问题,即基于anchor(锚点)的检测器随着人脸变小而急剧恶化。 基于锚点的目标检测方法是通过对一系列预设锚点进行分类和回归来检测目标的,这些锚点是通过在图像上有规律地平铺一组不同尺度和宽高比…

凡尔码安全巡检卡替代传统纸质记录卡

建筑行业、物业管理、医院等行业的安全巡检的记录方式通常以&#xff1a;1、纸质记录&#xff1a;巡检人员使用纸质巡检表格&#xff0c;手动填写巡检时间、巡检区域、巡检发现的问题以及处理情况。这种方式简单直接&#xff0c;但可能存在信息记录不完整、易丢失等问题。 2、电…

rust打包编译为mac或者linux可执行文件,发送到别的电脑不能运行

如果使用rust项目编译为linux或者mac可执行文件&#xff0c;发送到别的电脑之后&#xff0c;不可以直接运行&#xff0c;而是显示一个空白文件&#xff0c;双击也没有反应&#xff0c;其实这是因为这个文件没有可执行权限导致的&#xff0c;添加可执行权限就可以了&#xff1a;…

用户至上!探索7种常用的用户体验研究方法

用户体验研究是产品开放过程中的重要组成部分&#xff0c;优秀的产品设计与高质量的用户体验是不可分割的。对于产品开发&#xff0c;选择合适的用户体验研究方法在很大程度上决定了产品的使用效果。本文全面阐述了用户体验研究、用户体验研究的重要性和用户体验研究方法&#…

Linux进程间通信:system V共享内存

目录 一、什么是共享内存 1.1创建共享内存 1.2释放共享内存 1.2.1shmctl 1.2.2shmat 1.2.3 shmdt 二、共享内存的实现及使用 2.1ShmClient 2.2Shm_Server 2.3Fifo.hpp 2.4Comm.hpp 一、什么是共享内存 标准系统V也叫system V的本地通信方式一般有三种&#xff1a; …

行业新应用:电机驱动将成为机器人的动力核心

电机已经遍布当今社会人们生活的方方面面&#xff0c;不仅应用范围越来越广&#xff0c;更新换代的速度也日益加快。按照工作电源分类&#xff0c;可以将它划分为直流电机和交流电机两大类型。直流电机中&#xff0c;按照线圈类型分类&#xff0c;又可以分为有铁芯的电机、空心…

Redis 哨兵机制

文章目录 哨兵机制概念相关知识铺垫主从复制缺陷哨兵工作流程选举具体流程理解注意事项 哨兵机制概念 先抽象的理解&#xff0c;哨兵就像是监工&#xff0c;节点不干活了&#xff0c;就要有行动了。 Redis 的主从复制模式下&#xff0c;⼀旦主节点由于故障不能提供服务&#…

视频高效批量剪辑,一站式按顺序合并视频并添加精彩片头片尾,瞬间提升视频品质

视频已成为传递信息、展示创意的最佳方式。但你是否也曾因为繁琐的剪辑工作而头痛不已&#xff1f;别担心&#xff0c;今天我们就来聊聊如何轻松实现视频的高效批量剪辑&#xff0c;让你的作品按顺序完美合并&#xff0c;同时增添上令人眼前一亮的片头片尾&#xff0c;让你的宣…

【Python图像分类系列】建立CNN模型实现猫狗图像分类(案例+源码)

这是我的第275篇原创文章。 一、引言 基于CNN卷积神经网络在图像识别领域的应用&#xff1a;猫狗图像识别。主要内容包含&#xff1a; 数据创建和预处理 神经网络模型搭建 神经网络模型的训练和拟合 文中使用的深度学习框架是Keras。部分数据展示&#xff1a; 猫&#xf…

65-CPLD电路设计(安路为例)

视频链接 CPLD电路设计&#xff08;安路为例&#xff09;01_哔哩哔哩_bilibili CPLD电路设计&#xff08;以安路为例&#xff09; 浅谈板级电源设计的三种方法_哔哩哔哩_bilibili 参考【浅谈板级电源设计的三种方法】 FPGA板级硬件实战S1&#xff5e;7课 实战Power2-电…

【linux-IMX6ULL配置GPIO通用流程-以及时钟配置】

目录 1. GPIO模式控制流程1.1 LED、蜂鸣器、按键1.2 GPIO控制流程 2. 标准库的简要分析及实现&#xff1a;2.1 问题引入&#xff1a;2.2 代码实现&#xff1a; 3. 时钟配置总结&#xff1a;3.1 时钟树概要&#xff1a;3.2 IMX6ULL时钟概要及时钟树&#xff1a;3.3 IMX6ULL时钟配…

[C/C++] -- 代理模式

代理模式是一种结构型设计模式&#xff0c;允许一个对象&#xff08;代理&#xff09;控制另一个对象的访问。代理对象通常充当客户端和实际目标对象之间的中间人&#xff0c;从而控制对目标对象的访问&#xff0c;可以在访问前后进行一些额外的处理。 代理模式的优点包括&…

Python通过定义类实现增删改查(期末考试)

python高级编程期末测试 别看我挣的少&#xff0c;但是我省的多&#xff0c;昨天法拉利又省下两百多万。 一、通过创建自己类来实现增删改查 我们已经利用模型实现单表的增删改查了 现在 我们不想使用模型来操作数据库 我们可以自己定义模型 那么 如何通过自己创建的类实现增…

商标注册证下证的前后时间的注意!

近日下了6个商标注册证&#xff0c;商标初审公告是3个月时间&#xff0c;如果没人提出异议&#xff0c;公告结束后1个月内基本上都可以拿到商标注册证电子版&#xff0c;没有纸制版的&#xff0c;凡是邮寄到付签收纸制商标注册证的基本都是骗。 对商标提出异议的主体平常会在公…

2024年03月 C/C++(二级)真题解析#中国电子学会#全国青少年软件编程等级考试

C/C编程&#xff08;1~8级&#xff09;全部真题・点这里 第1题&#xff1a;满足条件的数的累加2 现有n个整数&#xff0c;将其中个位数为k的数进行累加求和 输入 第一行一个整数n。第二行n个非负整数&#xff0c;以空格分割&#xff0c;每个数不大于100000。第三行一个整数k。 …

uniapp——列表分享当前话题(一个页面多个分享)

案例 分享的时候弹出对应的标题和默认第一张图片 代码 <view v-for"(item,index) in list" :key"index"><button open-type"share" :id"index" click.stop"()>{}"><image src"/static/images/cir…

多客陪玩系统源码APP小程序H5陪玩开发伴游源码游戏陪玩平台源码陪玩平台开发约单源码线下陪玩接单平台app小程序H5源码游戏陪玩app小程序H5开发

出售成品陪玩app小程序H5源码&#xff0c;免费搭建部署和售后服务&#xff0c;并提供源码二开、定制开发等相关服务。 一、陪玩app源码的功能介绍 1、语音聊天: 陪玩app小程序H5源码用户随时创建语音聊天室&#xff0c;实现多用户上麦功能&#xff0c;提高互动聊天体验。 2、游…