数据结构修炼——顺序表和链表的OJ题练习

news2024/9/20 13:30:03

目录

  • 一、顺序表相关OJ题
    • 1 移除元素
      • 题目解析
    • 2 合并两个有序数组
      • 题目解析
  • 二、链表相关OJ题
    • 1 移除链表元素
      • 题目解析
    • 2 反转链表
      • 题目解析
    • 3 链表的中间结点
      • 题目解析
    • 4 合并两个有序链表
      • 题目解析
    • 5 链表的回文结构
      • 题目解析
    • 6 相交链表
      • 题目解析
    • 7 环形链表的判断
      • 题目解析
    • 8 环形链表
      • 题目解析

一、顺序表相关OJ题

顺序表的实现与数组息息相关,不可分割,一些顺序表相关的算法实际上就是数组相关的算法,因此顺序表的灵活运用需要我们更深一步的理解与掌握数组。

1 移除元素

leetcode 27. 移除元素
在这里插入图片描述

题目解析

题目大意:
给定一个值val,数组中不等于val的元素个数为k(k >= 0 && k <= numsSize),我们需要将数组中所有等于val的元素删除或者移到数组后面,并求出k值返回。

代码示例如下:

int removeElement(int* nums, int numsSize, int val)
{
    int l1, l2;
    l1 = l2 = 0;
    while (l2 < numsSize)
    {
        if (nums[l2] == val)
        {
            l2++;
        }
        else
        {
            nums[l1] = nums[l2];
            l1++;
            l2++;
        }
    }
    return l1;
}

这里给出的思路类似双指针法,定义两个变量代表下标,其中一个下标代表前k个元素的下标,其中一个下标经过等于val的元素就跳过,不等于就赋值给前k个元素。
如图:
在这里插入图片描述

  1. 开始时L1L2都位于下标0,进入第一次循环,nums[L2]不等于val则赋值给nums[L1]。且L1L2加1,移动至下标1。
  2. 进入第二次循环,nums[L2]等于valL2加1。L1仍位于下标1,L2位于下标2。
  3. 进入第三次循环,nums[L2]不等于valnums[L2]赋值给nums[L1]L1L2加1,L1位于下标2,L2位于下标3。

此时
在这里插入图片描述
以此类推…非val值元素会按顺序逐个向前覆盖,直到L2遍历完数组。

2 合并两个有序数组

leetcode 88.合并两个有序数组
在这里插入图片描述

题目解析

题目大意:合并两个非递减顺序的数组,两数组有效元素个数不同,合并数组也为非递减顺序且其结果存储在nums1数组中,因此nums1Size = m + n, nums2Size = n
代码示例如下:

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)
{
    int L1 = m - 1;//nums1数组最后一个有效元素的下标
    int L2 = n - 1;//nums2数组最后一个有效元素的下标
    int L3 = m + n - 1;//nums1数组可用的最大下标
    while (L1 >= 0 && L2 >= 0)//nums1或nums2数组遍历完就结束
    {
    	//从后往前比较nums1与nums2中有效元素的大小,大的放到nums1[L3],小的继续比
        if (nums1[L1] < nums2[L2])
        {
            nums1[L3--] = nums2[L2--];
        }
        else
        {
            nums1[L3--] = nums1[L1--];
        }
    }
    while (L2 >= 0)//如果nums2数组中有剩余元素则有序放入nums1中,如果没有则L2<0,不进入循环
    {
        nums1[L3--] = nums2[L2--];
    }
}

需要注意的是nums1数组因为存储合并结果,其容量为m + n,因此其后n个空间是空置的。这里采用的是从后往前比较两数组中的有效元素,较大的从后往前放置在nums1中。
在这里插入图片描述
由于数组为非递减序列的有序数组,因此在同一数组中靠后的元素一定大于等于前一元素,我们只需要比较两个数组的元素,判断出哪个更大即可。
例如:nums1[7] = 11 < nums2[5] = 12,所以将12放到nums1[13]即可。接着继续拿nums1[7] = 11比较nums2[4] = 1011大所以放到nums1[12],以此类推…
最终可能有两种情况,一是nums1先比完所有元素,二是nums2先比完所有元素。如果是情况二,正好完成数组合并且合并结果存储在nums1数组中;如果是情况一,我们需要将nums2数组中剩余元素继续从后往前依次放置到nums1中。
该算法最终时间复杂度为O(m+n),m、n分别取决于nums1与nums2的有效长度。

二、链表相关OJ题

1 移除链表元素

leetcode 203.移除链表元素
在这里插入图片描述

题目解析

题目大意:和顺序表OJ题移除元素类似,但这次换成了链表形式。我们要找出链表中所有数据元素等于val的结点并删除,最后返回新链表的头节点。注意这里的链表是不带头单向不循环链表。

代码示例如下:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
typedef struct ListNode LTNode;//为了方便重命名简化一下
LTNode* removeElements(LTNode* head, int val)
{
    LTNode* newhead, *ptail;//newhead为需要返回的新链表的头节点,ptail用于遍历链接新链表
    newhead = ptail = NULL;
    LTNode* pcur = head;//pcur用于遍历判断链表结点值
    while (pcur)
    {
        if (pcur->val != val)//找到非val值结点,则链接新链表
        {//链接前先判断新头节点newhead是否为空
            if (!newhead)
            {//newhead == NULL,赋值
                ptail = newhead = pcur;
            }
            else
            {//newhead != NULL,更新ptail的next指向
                ptail->next = pcur;
                ptail = ptail->next;
            }
        }
        pcur = pcur->next;
    }
    if (ptail)
        ptail->next = NULL;
    return newhead;
}

虽然链表结点的删除操作相比顺序表简单得多,但这里面仍有许多细节需要注意。这里我们采取的思路是多个指针遍历链表同时记录与判断当前结点是否符合条件。
例如指针pcurptail,后者用于记录新链表的尾结点;前者用于判断当前结点是否符合条件,如果符合条件,我们需要找到新链表当前的尾结点并将符合条件的新结点链接到此尾结点之后。当然这里还需要判断一下新链表是否为空,也就是对newhead判空,如果newhead为空则ptail也一定为空,所以需要对newheadptail进行赋值操作,将pcur找到的第一个符合条件的结点赋值给newheadptail
以此类推找下去,当ptail找到最后一个符合条件的结点时,我们还需要注意链表可能并未结束,因为如果后面存在若干个数据元素等于val的结点,那么pcur虽然会继续遍历跳过,直至为空结束循环,但ptail却不会继续遍历,ptail最后的终点一定是最后一个符合条件的结点,而最后一个符合条件的结点的next指针指向是不确定的,可能为空,也可能还跟着其他结点。所以需要增加一个ptail->next = NULL的语句确保ptail后面没有其他结点,同时为了防止ptail为空,所以增加一个判断语句对ptail判空。

2 反转链表

leetcode 206.反转链表
在这里插入图片描述

题目解析

题目大意:反转逆置任意单向不带头不循环链表,并返回新链表的新头结点,即原链表的尾结点。

代码示例如下:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
typedef struct ListNode LTNode;
struct ListNode* reverseList(struct ListNode* head)
{
    if (!head)
    {//链表为空直接返回
        return head;
    }
    LTNode *n1 = NULL, *n2 = head, *n3 = n2->next;//n1,n2,n3分别记录前一结点,当前结点,后一结点
    while (n2)
    {
        n2->next = n1;
        n1 = n2;
        n2 = n3;
        if (n3)
            n3 = n3->next;
    }
    return n1;
}

这里采取的思路同样是多个指针,同时记录了当前结点前一结点后一结点三个结点的位置,借此我们就可以遍历链表更改结点指针的指向了。
图示如下:
在这里插入图片描述
需要注意的是每一次循环的衔接与循环的结束条件。首先n2不能为空,其次下一次循环前,需要按照n1->n2->n3的顺序更新位置信息,先n1 = n2,再n2 = n3,接着确保n3不为空的同时n3 = n3->next。最后循环结束的条件是n2为空,当n3为空时n3没有下一个结点,而n2 = n3 = NULL,此时n1成为新链表的头结点,也即原链表的尾结点,而n2n3都为空。

3 链表的中间结点

leetcode 876.链表的中间结点
在这里插入图片描述

题目解析

题目大意:寻找链表的中间结点,若链表结点个数为偶数,则返回最中间的两个结点中的后一个结点,需要注意的是链表结点个数范围为[1, 100],即链表一定不为空。

代码示例如下:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
typedef struct ListNode LTNode;
struct ListNode* middleNode(struct ListNode* head)
{
    LTNode* slow, *fast;
    slow = fast = head;
    while (fast && fast->next)
    {
        slow = slow->next;
        fast = fast->next->next;
    }
    return slow;
}

示例采用的是快慢指针的思路,在初高中学习的时候我们一定遇见过”追及问题“。当两个人的速度为2倍关系时,两人走过的路程也一定为2倍关系。我们直接将其化为快慢指针法,fast快指针走两步,slow慢指针就走一步,这样它们的路程差为1倍,速度差也为1倍。
图示如下:
在这里插入图片描述
fastfast->next走至空就结束,slow即为所需结点。

4 合并两个有序链表

leetcode 21.合并两个有序链表
在这里插入图片描述

题目解析

题目大意:合并两个升序链表,链表结点的范围是[0, 50],即两链表都可能为空。

代码示例如下:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
typedef struct ListNode ListNode;
ListNode* mergeTwoLists(ListNode* list1, ListNode* list2)
{
	//其中一个链表为空,则直接返回另一个链表头节点即可
    if (!list1)
    {
        return list2;
    }
    else if (!list2)
    {
        return list1;
    }
    //两链表都不为空
    ListNode* l1, *l2;//用于遍历链表进行比较
    l1 = list1;
    l2 = list2;
    ListNode* phead, *ptail;//phead为哨兵位记录新链表的头结点,ptail记录新链表的当前尾结点
    phead = ptail = (ListNode*)malloc(sizeof(ListNode));//申请哨兵位结点
    phead->next = ptail->next = NULL;
    while (l1 && l2)//同时遍历两链表
    {//比较判断l1,l2中结点的值,小的放到新链表尾结点后
        if (l1->val < l2->val)
        {//l1小,l1结点放到新链表的尾结点后,同时找到l1下一结点
            ptail->next = l1;
            ptail = ptail->next;
            l1 = l1->next;
        }
        else
        {//l2小或相等,l2结点放到新链表的尾结点后,同时找到l2下一结点
            ptail->next = l2;
            ptail = ptail->next;
            l2 = l2->next;
        }
    }
    //两链表长度不一,循环比较完后,可能有一链表还有剩余结点
    if (l1)
    {//l1剩余结点
        ptail->next = l1;
    }
    if (l2)
    {//l2剩余结点
        ptail->next = l2;
    }
    ListNode* ret = phead->next;//返回值为哨兵位下一结点
    free(phead);
    phead = NULL;
    return ret;
}

与顺序表的合并相同,示例采取的思路是同时遍历两链表,并进行比较判断,哪个小就取哪个结点放到新链表,最后判断一下两链表是否有剩余结点,将剩余结点放到新链表后。

5 链表的回文结构

牛客 OR36 链表的回文结构
在这里插入图片描述

题目解析

题目大意:判断链表是否为回文结构,所谓回文结构类似轴对称,即将一个链表从中间分开,前一段和后一段的逆置是相等的。例如1->2->3->2->1可以从中间分为1221,逆置任意一段则得到另外一段。

代码示例如下:

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};*/
typedef struct ListNode ListNode;
struct ListNode* middleNode(struct ListNode* head)
{
    ListNode* slow, * fast;
    slow = fast = head;
    while (fast && fast->next)
    {
        slow = slow->next;
        fast = fast->next->next;
    }
    return slow;
}
struct ListNode* reverseList(struct ListNode* head)
{
    if (!head)
    {
        return head;
    }
    ListNode* n1 = nullptr, * n2 = head, * n3 = n2->next;
    while (n2)
    {
        n2->next = n1;
        n1 = n2;
        n2 = n3;
        if (n3)
            n3 = n3->next;
    }
    return n1;
}
bool chkPalindrome(ListNode* A)
{
    ListNode* midNode = middleNode(A);
    ListNode* cur = A;
    midNode = reverseList(midNode);
    while (cur && midNode)
    {
        if (cur->val != midNode->val)
        {
            return false;
        }
        cur = cur->next;
        midNode = midNode->next;
    }
    return true;
}

前面已经讲解过链表的中间结点以及链表的逆置等算法,这里可以直接拿来使用。思路大致为先得到中间结点,再逆置后一段链表结点,然后我们就可以分别遍历两段链表进行比较,若都对应相等则返回true,若不等则返回false。
图示如下:
在这里插入图片描述
在这里插入图片描述

6 相交链表

leetcode 160.相交链表
在这里插入图片描述

题目解析

题目大意:两个一定不为空的单链表,请判断它们是否相交,若相交则返回第一个相交结点,若不相交则返回NULL,注意返回时链表保存原始结构。

代码示例如下:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
typedef struct ListNode ListNode;
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB)
{
	//计算两链表各自的长度
    ListNode *curA = headA, *curB = headB;
    int lenA = 1, lenB = 1;
    while (curA->next != NULL)
    {
        lenA++;
        curA = curA->next;
    }
    while (curB->next != NULL)
    {
        lenB++;
        curB = curB->next;
    }
    //判断两链表的尾结点是否相交,相交链表的尾结点也一定相交
    if (curA != curB)
    {
        return NULL;
    }
    int sub = abs(lenA - lenB);//计算两链表长度的差值
    ListNode *LongList = headA, *ShortList = headB;
    if (lenA < lenB)
    {
        LongList = headB;
        ShortList = headA;
    }
    while (sub--)//长链表指针向后走若干步,使两链表处于相同长度的起始位置
    {
        LongList = LongList->next;
    }
    while (LongList && ShortList)//从相同长度的起始位置开始同时遍历两链表
    {
        if (LongList == ShortList)//判断两链表结点的地址是否相同
        {//链表结点的地址相同,则返回当前结点
            return LongList;
        }
        LongList = LongList->next;
        ShortList = ShortList->next;
    }
    return NULL;//不相交返回空指针
}

示例采取的思路是将两链表变成等长,这样同时遍历两链表时,两个链表上的指针就一定可以同时到达相交结点了,若遍历完链表都没有找到相同的结点地址,则链表一定不相交。

7 环形链表的判断

leetcode 141.环形链表
在这里插入图片描述

题目解析

题目大意:判断链表是否有环,即链表的尾结点的next指针指向的是空,还是某个结点。需要注意链表可以为空。

代码示例如下:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
bool hasCycle(struct ListNode *head)
{
    struct ListNode* slow = head, *fast = head;
    while (fast && fast->next)
    {
        slow = slow->next;
        fast = fast->next->next;
        if (slow == fast) return true;
    }
    return false;
}

这里同样采取快慢指针即可,因为如果存在环就一定存在循环,使用快慢指针且速度差为1倍时,快慢指针一定会相遇。

8 环形链表

leetcode 142.环形链表 II
在这里插入图片描述

题目解析

题目大意:在判断链表是否存在环的基础上,需要我们将链表入环的第一个结点返回。

思路一:
首先我们先来看一段证明,
在这里插入图片描述
L为进环前的长度,X为进环后慢指针走的路程,R为环长。当快慢指针从头节点开始向后走时,慢指针走过L / 2时快指针走过L到达入环结点,当慢指针走过L时快指针在圈内走了L/2,由于环长与进环前的长度没有特定关系,所以不能确定快指针在圈内走过了多少圈。慢指针入环走了x步与快指针相遇在M点,此时一定是慢指针在环内的第一圈,因为慢指针走完一圈,快指针可以走过两圈,所以在第二圈之前两指针一定相遇了,同时由于速度差以及追击问题我们也可以确定快指针在相遇前一定已经走过一次M点,即快指针起码绕环转了一圈。
由相遇的整个过程分析可知,
快指针路程:L + X + nR (n为圈数,n >= 1)
慢指针路程:L + X
由速度关系得出: 2(L + X) = L + X + nR,即L = nR - X
我们得出L = nR - X的关系式要怎么用呢?我们先来变个形式。
变成:L = (n - 1)R + R - X
其中(n - 1)R代表圈数乘以环长,而R - X代表了相遇结点重新走回入环点的距离。这说明我们只要用一个指针从头节点开始走L步,同时让相遇结点处的指针同样走L步,那么相遇结点的指针就会走(n - 1)圈最后走R-X步回到入环点,而这时从头节点开始走的指针也会走到入环点,我们只需要进行一个判断即可得到入环结点。

代码示例如下:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
typedef struct ListNode ListNode;
ListNode *detectCycle(ListNode *head)
{
	//先判断是否存在环
    ListNode* slow = head, *fast = head;
    while (fast && fast->next)
    {
        slow = slow->next;
        fast = fast->next->next;
        if (slow == fast)
        {
        	//环存在,让一个指针从头结点开始重新走,让一个指针从相遇结点继续在环内走
            ListNode* meet = slow;
            while (meet != head)
            {
                meet = meet->next;
                head = head->next;
            }
            return meet;
        }
    }
    return NULL;
}

思路二:
其实我们可以试着在相遇结点处将环断开,如下
在这里插入图片描述
在这里插入图片描述
先记录下meet->next,用newhead保存,同时将meet->next置为空,这样链表就从meet处断开了,就构成了两个链表,一个从a到b,一个从c到b,我们只需要将两个链表的头结点传给前面相交链表的函数中即可得出第一个相交结点,也即入环点。

代码示例如下:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
typedef struct ListNode ListNode;
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB)
{
    //求相交链表的交点并返回
    struct ListNode *curA = headA, *curB = headB;
    int lenA = 1, lenB = 1;
    while (curA->next != NULL)
    {
        lenA++;
        curA = curA->next;
    }
    while (curB->next != NULL)
    {
        lenB++;
        curB = curB->next;
    }
    if (curA != curB)
    {
        return NULL;
    }
    int sub = abs(lenA - lenB);
    ListNode *LongList = headA, *ShortList = headB;
    if (lenA < lenB)
    {
        LongList = headB;
        ShortList = headA;
    }
    while (sub--)
    {
        LongList = LongList->next;
    }
    while (LongList && ShortList)
    {
        if (LongList == ShortList)
        {
            return LongList;
        }
        LongList = LongList->next;
        ShortList = ShortList->next;
    }
    return NULL;
}
ListNode *detectCycle(ListNode *head)
{
    ListNode* slow = head, *fast = head;
    while (fast && fast->next)
    {
        slow = slow->next;
        fast = fast->next->next;
        if (slow == fast)
        {
            //断环,改为求相交链表问题
            struct ListNode* meet = slow;
            struct ListNode* newhead = meet->next;
            meet->next = NULL;
            meet = getIntersectionNode(head, newhead);
            slow->next = newhead;
            return meet;
        }
    }
    return NULL;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

共享单车轨迹数据分析:以厦门市共享单车数据为例(四)

副标题&#xff1a;共享单车与地铁接驳距离探究——以厦门市为例 关于轨道交通站点接驳范围的研究早已屡见不鲜&#xff0c;通常认为以站点为圆心、800米作为地铁站直接的服务范围是合理的。近年来&#xff0c;随着轨道、公交和慢行交通三网融合概念的提出&#xff0c;慢行交通…

9.第二阶段x86游戏实战2-初识易语言

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 工具下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd6tw3 提…

喜报 | 大势智慧荣获国家级专精特新重点“小巨人”企业荣誉称号

近日&#xff0c;湖北省经济和信息化厅发布了《关于2024年拟支持专精特新重点“小巨人”企业名单的公示》。武汉大势智慧科技有限公司&#xff08;后简称“大势智慧”&#xff09;凭借在实景三维AI领域的卓越技术表现和创新能力&#xff0c;成功上榜并通过公示期&#xff0c;荣…

预算不多怎么选一款开放式耳机?四款亲测好用的蓝牙耳机推荐

挑选开放式耳机可以从以下几个方面入手&#xff1a; 关注佩戴舒适度&#xff1a; 外观设计&#xff1a;开放式耳机有耳挂式、夹耳式等多种设计。耳挂式耳机通常佩戴较为稳固&#xff0c;适合运动时使用&#xff1b;夹耳式耳机相对轻便&#xff0c;但可能需要一定时间适应其佩…

多核DSP(6000系列)设计与调试技巧培训

​课程介绍&#xff1a; 为帮助从事DSP开发工程师尽快将DSP技术转化为产品&#xff0c;在较短时间内掌握DSP设计技术和问题的解决方法&#xff0c;缩短产品开发周期、增强产品竞争力、节省研发经费。我们特组织了工程实践和教学经验丰富的专家连续举办了多期DSP C6000的培训&a…

六氟化硫密度微水在线监测配套5孔M12格兰头航空插头插座

我们将为大家介绍如何使用六氟化硫密度微水在线监测配套5孔M12格兰头连接器。在本教程中&#xff0c;我们将向您展示简单易懂的步骤&#xff0c;让您轻松掌握。 所需材料&#xff1a; 1. 六氟化硫密度微水在线监测器 2. 5孔M12格兰头连接器 3. 电源线 4. 符合要求的电缆 5…

批量视频压缩需要怎么压缩?2024帮助你快速进行视频压缩的软件

批量视频压缩需要怎么压缩&#xff1f;2024帮助你快速进行视频压缩的软件 批量视频压缩是处理大量视频文件时常见的需求&#xff0c;特别是当你需要减小视频大小以便存储或上传时。以下是5款帮助你快速进行视频压缩的软件&#xff0c;它们操作简单&#xff0c;功能强大&#x…

三、k8s中的控制器的使用

一 什么是控制器 官方文档&#xff1a; 工作负载管理 | Kubernetes 控制器也是管理pod的一种手段 自主式pod&#xff1a;pod退出或意外关闭后不会被重新创建 控制器管理的 Pod&#xff1a;在控制器的生命周期里&#xff0c;始终要维持 Pod 的副本数目 Pod控制器是管理pod…

Java高级Day41-反射入门

115.反射 反射机制 1.根据配置文件re.properties指定信息&#xff0c;创建Cat对象并调用hi方法 SuppressWarnings({"all"}) public class ReflectionQuestion {public static void main(String[] args) throws IOException {//根据配置文件 re.properties 指定信息…

最新热点!结合创新!小样本学习+CLIP:超好上手的思路,爽发顶会顶刊

今天给大家推荐一个很好上手的创新思路&#xff1a;小样本学习CLIP。 这个思路的优势在于&#xff1a;通过利用CLIP模型强大的跨模态表征能力&#xff0c;再结合小样本学习技术&#xff0c;我们就可以在仅提供少量标注样本的情况下&#xff0c;快速适应新的任务&#xff0c;在…

elementui组件el-upload实现批量文件上传

el-upload组件上传文件时&#xff0c;每传一个文件会调一次接口&#xff0c;所以当上传多个文件的时候&#xff0c;有 n 个文件就要调 n 次接口。 刚好之前工作中遇到使用el-upload组件批量上传文件的需求&#xff0c;来看看怎么实现。 思路&#xff1a; 1.取消组件的自动上…

【C++】vector常见用法

&#x1f525;个人主页&#x1f525;&#xff1a;孤寂大仙V &#x1f308;收录专栏&#x1f308;&#xff1a;C从小白到高手 &#x1f339;往期回顾&#x1f339;&#xff1a;[C]string类 &#x1f516; 流水不争&#xff0c;争的是滔滔不息。 文章目录 一、vector的介绍vector…

KubeCon China 回顾|快手的 100% 资源利用率提升:从裸机迁移大规模 Redis 到 Kubernetes

大家下午好&#xff0c;我是来自 ApeCloud 的吴学强&#xff0c;非常高兴能够在 KubeCon 做分享。今天的分享由我和来自快手的刘裕惺同学共同完成&#xff0c;我们分享的主题是将大规模的 Redis 实例从裸机迁移到 Kubernetes 上来提高资源的利用率。 我们今天的议题包括几个方…

价值流与核心理论框架对比解析:企业业务架构优化的全景指南

企业架构优化中的理论框架选择 随着数字化转型和全球竞争的加剧&#xff0c;企业管理者越来越意识到优化业务流程以提升竞争力的重要性。然而&#xff0c;在众多优化方法中&#xff0c;企业如何选择最适合自己的理论框架成为一大挑战。由The Open Group发布的《价值流指南》系…

配电房监控 配电柜监测系统方案简介@卓振思众

在当今迅速发展的电力行业中&#xff0c;配电柜监测系统的作用越来越受到重视。作为配电系统的核心组件&#xff0c;配电柜不仅承担着电力分配的关键任务&#xff0c;还面临着安全性和稳定性的重要挑战。为了确保电力供应的连续性和可靠性&#xff0c;配电柜监测系统应运而生&a…

鼎捷新一代PLM 荣膺维科杯 “2023年度行业优秀产品奖”

近日&#xff0c;由中国高科技行业门户OFweek维科网主办的“全数会2024&#xff08;第五届&#xff09;中国智能制造数字化转型大会暨维科杯工业自动化及数字化行业年度评选颁奖典礼”在深圳隆重举办。这不仅是中国工业自动化及数字化行业的一大品牌盛会&#xff0c;亦是高科技…

vue2基础系列教程之todo的实现及面试高频问题

关键知识点 v2里面&#xff0c;当在同一个元素或组件上同时使用v-for和v-if,v-for的权限高于v-if v-show和v-if的区别主要有 v-if是惰性的&#xff0c;v-show是及时的v-if值为false时&#xff0c;不会生成dom,v-show不管值是true或false,都会生成dom,修改的是dom的display属性…

画图方法总结

1、画两天线段的代码 #画图 import matplotlib.pyplot as plt from matplotlib import font_manager font_path simfang.ttf # 替换为实际的字体文件路径 font_prop font_manager.FontProperties(fnamefont_path, size12) # 设置字体大小 plt.figure() plt.plot(csv_data[…

标准库、HAL库、LL库

目录 举例理解 概念理解 标准库&#xff08;Standard Peripheral Library&#xff0c;SPL&#xff09; 2. HAL库&#xff08;Hardware Abstraction Layer&#xff09; 3. LL库&#xff08;Low-Layer Library&#xff09; 总结区别 如何选择 实际应用中的结合使用 代码…

Flutter iOS混淆打包

1. Xcode配置好环境和版本号 2. Terminal输入混淆打包命令 flutter build ipa --obfuscate --split-debug-info./symbols 生成包路径&#xff1a;项目名/build/ios/archive/Runner. xcarchive 3. 将上述文件复制到Xcode下 ~/Library/Developer/Xcode/Archives 4. 打开Xcode-…