【算法】面试题 - 链表

news2025/1/18 13:58:49

链表相关面试题

  • 141. 环形链表
    • 问题:快慢指针为什么一定会相遇
  • 142. 环形链表 II
    • 问题:如何确认入口
  • 160. 相交链表
  • 237. 删除链表中的节点
  • 19. 删除链表的倒数第 N 个结点
  • 21. 合并两个有序链表
  • 23. 合并K个升序链表(两种解法)
    • 扩展:[PriorityQueue](https://blog.csdn.net/yzx3105/article/details/128442507)
  • 86. 分隔链表
  • 876. 链表的中间结点
  • 2. 两数相加
  • 206. 反转链表

141. 环形链表

题目描述:
给定一个链表,判断链表中是否有环。
为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。
示例 1:
在这里插入图片描述

输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。

示例 2:
在这里插入图片描述

输入:head = [1,2], pos = 0
输出:true
解释:链表中有一个环,其尾部连接到第一个节点。

示例3:
在这里插入图片描述

输入:head = [1], pos = -1
输出:false
解释:链表中没有环。

代码:

public class Solution {
    public boolean hasCycle(ListNode head) {
        if (head == null) {
            return false;
        }
        
        ListNode fast = head;
        ListNode slow = head;
        while (fast != null && fast.next != null) {
            fast = fast.next.next;
            slow = slow.next;
            if (fast == slow) {
                break;
            }
        }
        return fast != null && fast.next != null;
    }
}

问题:快慢指针为什么一定会相遇

慢指针每次移动一格,快指针每次移动两格,在有环的链表里,他们一定会相遇
1、当快指针就在慢指针后面,那么下一次慢指针移动一位,快指针移动两位,相遇
2、当快指针和慢指针差一个位置,那么下一次慢指针移动一位,快指针移动两位,他们会变成第一种情况
3、当快指针和慢指针差两个位置,那么下一次慢指针移动一位,快指针移动两位,他们会变成第二种情况
我知道你也在纠结为什么会没有快指针跳过慢指针他们没有相遇的这种情况发生,但是这种情况只会发生在他们相遇后的下一次移动
原因:其实从上面的三步不难看出:快指针是一格一格追赶慢指针的,即他们的距离是…4->3->2->1->0这样缩短的。所以一定会相遇

在这里插入图片描述

快慢指针为什么一定会相遇(文章参考):https://blog.csdn.net/Leslie5205912/article/details/89386769

142. 环形链表 II

题目描述:
给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。
**说明:**不允许修改给定的链表。

示例 1:
在这里插入图片描述

输入:head = [3,2,0,-4], pos = 1
输出:tail connects to node index 1
解释:链表中有一个环,其尾部连接到第二个节点。

示例 2:
在这里插入图片描述

输入:head = [1,2], pos = 0
输出:tail connects to node index 0
解释:链表中有一个环,其尾部连接到第一个节点。

示例 3:
在这里插入图片描述

输入:head = [1], pos = -1
输出:no cycle
解释:链表中没有环。

代码:

public class Solution {
    static ListNode detectCycle(ListNode head) {
        ListNode slow = head;
        ListNode fast = head;

        while (fast != null && fast.next != null) {
            slow = slow.next;
            fast = fast.next.next;
            if (slow == fast) {
                break;
            }
        }
        //无环
        if (fast == null || fast.next == null) {
            return null;
        }

        //有环 这时候起点至入口的距离等于相交点至入口的距离,因此两个指针用同样的速度直到相遇就是入口
        slow = head;
        while (slow != fast) {
            slow = slow.next;
            fast = fast.next;
        }
        return fast;
    }
}

问题:如何确认入口

在这里插入图片描述

如图:
慢指针走了 x+y 的距离
快指针走了 x+y+n(y+z)的距离
由于快指针是慢指针的二倍速度,因此得出公式
2(x+y) = x+y+n(y+z)
x = n(y+z)-y //放出去一个x+y
x = (n-1)(y+z)+z //n至少等于1,当n=1的时候可以推导出 x=z
因此,当两个指针用同样的速度走,相遇点就是入口

具体详解视频:https://www.bilibili.com/video/BV1if4y1d7ob

160. 相交链表

题目描述:
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null
题目数据 保证 整个链式结构中不存在环。
注意,函数返回结果后,链表必须 保持其原始结构 。
图示两个链表在节点 c1 开始相交:
在这里插入图片描述
示例:1
在这里插入图片描述

输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,6,1,8,4,5], skipA = 2, skipB = 3
输出:Intersected at '8'
解释:相交节点的值为 8 (注意,如果两个链表相交则不能为 0)。
从各自的表头开始算起,链表 A[4,1,8,4,5],链表 B[5,6,1,8,4,5]。
在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。
— 请注意相交节点的值不为 1,因为在链表 A 和链表 B 之中值为 1 的节点 (A 中第二个节点和 B 中第三个节点) 是不同的节点。换句话说,它们在内存中指向两个不同的位置,而链表 A 和链表 B 中值为 8 的节点 (A 中第三个节点,B 中第四个节点) 在内存中指向相同的位置。

示例:2
在这里插入图片描述

输入:intersectVal = 2, listA = [1,9,1,2,4], listB = [3,2,4], skipA = 3, skipB = 1
输出:Intersected at '2'
解释:相交节点的值为 2 (注意,如果两个链表相交则不能为 0)。
从各自的表头开始算起,链表 A[1,9,1,2,4],链表 B[3,2,4]。
在 A 中,相交节点前有 3 个节点;在 B 中,相交节点前有 1 个节点。

示例:3
在这里插入图片描述

输入:intersectVal = 0, listA = [2,6,4], listB = [1,5], skipA = 3, skipB = 2
输出:null
解释:从各自的表头开始算起,链表 A[2,6,4],链表 B[1,5]。
由于这两个链表不相交,所以 intersectVal 必须为 0,而 skipA 和 skipB 可以是任意值。
这两个链表不相交,因此返回 null

代码:

static ListNode getIntersectionNode(ListNode headA, ListNode headB) {
    ListNode a = headA;
    ListNode b = headB;
    while (a != b) {
        a = a != null ? a.next : headB;
        b = b != null ? b.next : headA;
    }
    return a;
}

237. 删除链表中的节点

题目描述:
有一个单链表的 head,我们想删除它其中的一个节点 node。
给你一个需要删除的节点 node 。你将 无法访问 第一个节点 head。
链表的所有值都是 唯一的,并且保证给定的节点 node 不是链表中的最后一个节点。
删除给定的节点。注意,删除节点并不是指从内存中删除它。这里的意思是:

给定节点的值不应该存在于链表中。
链表中的节点数应该减少 1。
node 前面的所有值顺序相同。
node 后面的所有值顺序相同。

示例:1
在这里插入图片描述

输入:head = [4,5,1,9], node = 5
输出:[4,1,9]
解释:指定链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9

示例:2
在这里插入图片描述

输入:head = [4,5,1,9], node = 1
输出:[4,5,9]
解释:指定链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9

代码:

void deleteNode(ListNode node) {
    node.val = node.next.val;
    node.next = node.next.next;     
}

19. 删除链表的倒数第 N 个结点

题目描述:
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
示例:1
在这里插入图片描述

输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]

示例:2

输入:head = [1], n = 1
输出:[]

示例:3

输入:head = [1,2], n = 1
输出:[1]

代码:

static ListNode removeNthFromEnd(ListNode head, int n) {
	//给出一个虚拟头指针,方便后期操作
    ListNode dummy = new ListNode(0);
    dummy.next = head;

    //fast先往前走n步
    ListNode fast = dummy;
    for (int i = 0; i < n; i++) {
        fast = fast.next;
    }

    //fast slow同步往前走,直到fast走到了null,这时候slow指向被删除节点的前一个节点
    ListNode slow = dummy;
    while (fast != null) {
        fast = fast.next;
        slow = slow.next;
    }
    
    slow.next = slow.next.next;

    return dummy.next;
}

21. 合并两个有序链表

题目描述:
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:1

输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4

代码:

static ListNode merge(ListNode l1, ListNode l2) {
     ListNode result = new ListNode(0);

     ListNode pre = result;
     while (l1 != null && l2 != null) {
         if (l1.val > l2.val) {
             pre.next = l2;
             l2 = l2.next;
         } else {
             pre.next = l1;
             l1 = l1.next;
         }
         pre = pre.next;
     }
     //如果两边长度不一致,剩下的则可以直接追加
     pre.next = l1 == null ? l2 : l1;

     return result.next;
 }

23. 合并K个升序链表(两种解法)

题目描述:
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:1

输入:
[
  1->4->5,
  1->3->4,
  2->6
]
输出: 1->1->2->3->4->4->5->6

代码:(利用数组遍历找到最小值)
在这里插入图片描述

    static ListNode merge(ListNode[] listNodeArr) {
        ListNode result = new ListNode(0);
        ListNode cur = result;
        
        while (true) {
            int minIndex = -1;
            //找到最小索引
            for (int i = 0; i < listNodeArr.length; i++) {
                if (listNodeArr[i] != null) {
                    if (minIndex == -1) {
                        minIndex = i;
                    } else {
                        if (listNodeArr[i].val < listNodeArr[minIndex].val) {
                            minIndex = i;
                        }
                    }
                }
            }

            //如果minIndex:-1,证明数组中没有数据了
            if (minIndex == -1) {
                return result.next;
            }

            //result拼接当前最小节点
            cur.next = listNodeArr[minIndex];
            //cur后移
            cur = cur.next;

            //listNodeArr[minIndex]后移
            listNodeArr[minIndex] = listNodeArr[minIndex].next;
        }
    }

代码2:(利用小顶堆)

static ListNode merge2(ListNode[] listNodeArr) {
    //使用小顶堆,每次取出的都是最小的节点
    Queue<ListNode> minHeap = new PriorityQueue<>(Comparator.comparingInt(node -> node.val));
    ListNode result = new ListNode(0);
    ListNode cur = result;

    //将节点放进去
    for (ListNode list : listNodeArr) {
        if (list != null) {
            minHeap.offer(list);
        }
    }

    while (!minHeap.isEmpty()) {
        //弹出最小值
        ListNode tempNode = minHeap.poll();
        cur.next = tempNode;
        cur = cur.next;

        //往堆里放入当前节点的next
        if (tempNode.next != null) {
            minHeap.offer(tempNode.next);
        }
    }

    return result.next;
}

扩展:PriorityQueue

86. 分隔链表

题目描述:
给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。
你应当 保留 两个分区中每个节点的初始相对位置。
示例:1
在这里插入图片描述

输入:head = [1,4,3,2,5,2], x = 3
输出:[1,2,2,4,3,5]

示例:2

输入:head = [2,1], x = 2
输出:[1,2]

代码:

/**
 * 利用两个链表,将小于num的节点放到minNodeHead链表,大于等于num的节点放到maxNodeHead链表,最后,将minNodeHead拼接maxNodeHead返回
 * @param head
 * @param num
 * @return
 */
static ListNode partition(ListNode head, int num) {
    ListNode minNodeHead = new ListNode(0);
    ListNode maxNodeHead = new ListNode(0);

    ListNode minPre = minNodeHead;
    ListNode maxPre = maxNodeHead;
    while (head != null) {
        if (head.val < num) {
            minPre.next = head;
            minPre = minPre.next;
        } else {
            maxPre.next = head;
            maxPre = maxPre.next;
        }
        head = head.next;
    }

    maxPre.next=null;
    minPre.next = maxNodeHead.next;
    return minNodeHead.next;
}

876. 链表的中间结点

题目描述:
给定一个头结点为 head 的非空单链表,返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点。
示例:1

输入:[1,2,3,4,5]
输出:此列表中的结点 3 (序列化形式:[3,4,5])
返回的结点值为 3(测评系统对该结点序列化表述是 [3,4,5])。
注意,我们返回了一个 ListNode 类型的对象 ans,这样:
ans.val = 3, ans.next.val = 4, ans.next.next.val = 5, 以及 ans.next.next.next = NULL.

示例:2

输入:[1,2,3,4,5,6]
输出:此列表中的结点 4 (序列化形式:[4,5,6])
由于该列表有两个中间结点,值分别为 34,我们返回第二个结点。

代码:

static ListNode middleNode(ListNode head) {
     ListNode fast = head;
     ListNode slow = head;
     
     while (fast.next != null && fast.next.next != null) {
         fast = fast.next.next;
         slow = slow.next;
     }
     //如果是奇数个节点,fast最后指向的是最后一个节点,如果是偶数个节点,fast最后指向的是倒数第二个节点
     //因此,如果fast.next==null,证明是奇数个节点,直接返回slow
     //如果fast.next.next==null,证明是偶数个节点,返回slow.next(返回第二个中间节点)
     if(fast.next == null){
         return slow;
     }else{
         return slow.next;
     }
 }

2. 两数相加

问题描述
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

代码

static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
    ListNode head = new ListNode(0);//先给出一个节点,避免下面判断空,return head.next就好

    ListNode pre = head;
    int more = 0; //进位
    int sum = 0;//两个数字相加之和
    while (l1 != null || l2 != null || more != 0) {
        sum = (l1 != null ? l1.val : 0) + (l2 != null ? l2.val : 0) + more;
        more = sum / 10; //加出来的数字超过10,进一位
        sum = sum % 10; //加出来的数字值需要个位数

        //链表增加节点
        ListNode newNode = new ListNode(sum);
        pre.next = newNode;
        //pre指向当前最新节点,方便后面增加节点
        pre = newNode;

        //l1 l2都指向下一个节点,继续相加
        l1 = l1.next != null ? l1.next : null;
        l2 = l2.next != null ? l2.next : null;
    }
    return head.next;
}

206. 反转链表

题目描述:
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
示例:1
在这里插入图片描述

输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]

示例:2
在这里插入图片描述

输入:head = [1,2]
输出:[2,1]

示例:3

输入:head = []
输出:[]

代码:

public ListNode reverseList(ListNode head) {
    ListNode dummy = new ListNode(0);
     while (head != null) {
         ListNode next = head.next;
         head.next = dummy.next;
         dummy.next = head;
         head = next;
     }
     return dummy.next;
 }
  1. 环形链表 II(详解视频):https://www.bilibili.com/video/BV1if4y1d7ob
  2. 相交链表(详解视频):https://www.bilibili.com/video/BV1aK411N7fW
  3. 删除链表的倒数第 N 个结点(详解视频): https://www.bilibili.com/video/BV1fq4y1y7z3
  4. 合并两个有序链表(视频讲解): https://www.bilibili.com/video/BV1vo4y1Q7Ew
  5. 合并K个有序链表(视频讲解):https://www.bilibili.com/video/BV1QK4y1N7ww
  6. 两数相加(视频讲解):https://www.bilibili.com/video/BV11C4y1t7iY
  7. 分隔链表(视频讲解):https://www.bilibili.com/video/BV1Gq4y1e7GH
  8. 链表的中间结点(视频讲解):https://www.bilibili.com/video/BV1UK411n7RN

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

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

相关文章

国产手机扬眉吐气,终于打击了苹果的嚣张气焰

苹果在9月份、10月份都取得了快速增长&#xff0c;而国产手机品牌持续下滑&#xff0c;但是11月份终于让国产手机捡回了主动权&#xff0c;11月份的数据显示有国产手机品牌的出货量大幅增长&#xff0c;而苹果的出货量却大幅下滑&#xff0c;国产手机成功反击了苹果。分析机构给…

Vue + SpreadJS 实现高性能数据展示与分析

Vue SpreadJS 实现高性能数据展示与分析 在前端开发领域&#xff0c;表格一直都是一个高频使用的组件&#xff0c;尤其是在中后台和数据分析场景下。但当一屏展示数据超过1000条数据记录时&#xff0c;会出现浏览器卡顿等问题&#xff0c;严重影响客户体验。为解决这些性能问…

Seay代码审计系统审计实战

今天继续给大家介绍渗透测试相关知识&#xff0c;本文主要内容是Seay代码审计系统审计实战。 免责声明&#xff1a; 本文所介绍的内容仅做学习交流使用&#xff0c;严禁利用文中技术进行非法行为&#xff0c;否则造成一切严重后果自负&#xff01; 再次强调&#xff1a;严禁对未…

【算法题解】5. 删除有序数组中的重复项 + 移动零

文章目录删除有序数组中的重复项题目解题思路代码实现复杂度分析移动零题目解题思路代码实现复杂度分析删除有序数组中的重复项 题目 给你一个 升序排列 的数组 nums &#xff0c;请你原地删除重复出现的元素&#xff0c;使每个元素只出现一次 &#xff0c;返回删除后数组的新…

Python 并发编程实战,用多线程、多进程、多协程加速程序运行

Python 并发编程实战&#xff0c;用多线程、多进程、多协程加速程序运行 文章目录Python 并发编程实战&#xff0c;用多线程、多进程、多协程加速程序运行1、什么是CPU密集型计算、IO密集型计算&#xff1f;2、多线程、多进程、多协程的对比3、怎么根据任务选择对应技术&#x…

达梦数据成功过会!信创浪潮中如何成就一家国产龙头?

‍‍数据智能产业创新服务媒体——聚焦数智 改变商业2022年12月22日&#xff0c;上海证券交易所科创板上市委员会发布《2022年第110次审议会议结果公告》&#xff0c;武汉达梦数据股份有限公司&#xff08;首发&#xff09;符合发行条件、上市条件和信息披露要求。该公告标志着…

5.4 迭代语句

文章目录while语句使用while循环传统for语句传统for循环的执行过程for语句头中的多重定义省略for语句头的某些部分范围for语句do while语句迭代语句通常称为循环,它重复执行操作直到满足某个条件才停下来。while和for语句在执行循环体之前检查条件&#xff0c;do while 语句先执…

MATLAB算法实战应用案例精讲-【连接分析】PageRank(补充篇)(附Python代码实现)

前言 PageRank算法在1998年4月举行的第七届国际万维网大会上由Sergey Brin和Larry Page提出。PageRank是通过计算页面链接的数量和质量来确定网站重要性的粗略估计。算法创立之初的目的是应用在Google的搜索引擎中,对网站进行排名。 随着国内外学者的深入研究,PageRank算法…

burpsuite靶场——SSRF

文章目录针对本地服务器的基本 SSRF针对另一个后端系统的基本 SSRFSSRF 与基于黑名单的输入过滤器基于白名单的输入过滤器的 SSRFSSRF 通过开放重定向漏洞绕过过滤器带外检测的盲 SSRF利用 Shellshock 的盲 SSRF针对本地服务器的基本 SSRF 在商品下查看货物库存情况时抓包 有st…

操作系统实验2:fork()系统调用

操作系统实验2:fork()系统调用 文章目录操作系统实验2:fork()系统调用Task1: fork的基本使用代码运行结果解释Task2: 深入理解fork创建的子进程与父进程的关系代码实验结果现象解释遇到的问题1.乌龙事件 vscode2.the troubles encountered in task1如何跑.sh文件编译链接遇到的…

SegeX Progress:MFC通用进度条

----哆啦刘小洋 原创&#xff0c;转载需说明出处 MFC高级通用进度条-目录1 简介2 进度条实现基本原理3 使用方法3 .1 简单情况3.2 两个前后独立的进度条3.3 实际应用的一般情况3.4 带子进度条4 其他4.1 使用限制4.2 其他全局宏&#xff08;函数&#xff09;4.3 当前进度条设置1…

技术开发107

技术开发107 业务内容&#xff1a; 汽车音响等汽车电子部件试制、电子设备部件试制、精密钣金试制精密钣金试制 公司简介&#xff1a; 代表&#xff1a;中山尚美 成立时间&#xff1a;1950年6月 资本金&#xff1a;1000万日元 员工数&#xff1a;15名 资格认证&#xff…

数智为线,经纬中国:新华三勾勒出的山河锦绣

刺绣&#xff0c;是中华民族源远流长的技艺美术。早在《尚书》中&#xff0c;就记载了章服制度“衣画而裳绣”。而刺绣之美之所以能够传承千年&#xff0c;形成中国审美的一张名片&#xff0c;就是因为传统的染色技艺不够精细&#xff0c;颜色常常浮在布匹表面&#xff0c;但刺…

【卫朋】营销技能:营销4P之外,还有这些经典理论

一提到市场营销&#xff0c;很多人都可能会联想到经典的营销4P理论&#xff0c;但你可能不知道的是&#xff0c;4P理论只是“4字营销理论家族”中的一员。 市场营销“4字家族”中的4P、4R、4C理论构成了市场营销的基础部分。 它们诞生于特殊的环境和年代&#xff0c;为当时的企…

Redis原理篇—内存回收

Redis原理篇—内存回收 笔记整理自 b站_黑马程序员Redis入门到实战教程 内存过期策略-过期key处理 Redis 之所以性能强&#xff0c;最主要的原因就是基于内存存储。然而单节点的 Redis 其内存大小不宜过大&#xff0c;会影响持久化或主从同步性能。 我们可以通过修改配置文件…

再学C语言16:表达式和语句

语句组成了C的基本程序的步骤&#xff0c;大多数语句由表达式构造而成 一、表达式 表达式&#xff08;expression&#xff09;由运算符和操作数组合构成 操作数是运算符操作的对象&#xff0c;可以是常量、变量或二者的组合 C的一个重要属性&#xff1a;每一个C表达式都有一…

Python 基础教程(1)——翻转字符串、集合运算、字符串、列表、元组、字典、数据类型转换、Python推导式、Python运算符、Python 数字类型转换、字符串

1.翻转字符串 def reverseWords(input):# 通过空格将字符串分隔符&#xff0c;把各个单词分隔为列表inputWords input.split(" ")# 翻转字符串# 假设列表 list [1,2,3,4], # list[0]1, list[1]2 &#xff0c;而 -1 表示最后一个元素 list[-1]4 ( 与 list[3]4 一样…

【C++进阶】特殊类设计

&#x1f387;C学习历程&#xff1a;入门 博客主页&#xff1a;一起去看日落吗持续分享博主的C学习历程博主的能力有限&#xff0c;出现错误希望大家不吝赐教分享给大家一句我很喜欢的话&#xff1a; 也许你现在做的事情&#xff0c;暂时看不到成果&#xff0c;但不要忘记&…

vue书写一个uni-app小程序

在本次文章中我来大致向大家介绍一下如何使用Hbuilder X来编写一个uni-app的小程序的项目&#xff0c;在此我只说编写的方法与方向&#xff0c;具体的操作留给大家去亲自实操哦。 1.起步&#xff08;创建一个uni-app框架&#xff09;&#xff1a; 首先&#xff0c;我们需要把…

低代码破解了软件开发“不可能三角”?我做了个测评...

老读者知道&#xff0c;K哥写了10几年代码&#xff0c;后来转做技术管理&#xff0c;现在是上市公司的技术高管。在我们软件行业有一条铁律&#xff1a;长周期、大规模的软件研发过程当中&#xff0c;想要维持良好的运作&#xff0c;需要解决&#xff1a;成本、效能、质量。而且…