技术图文:双指针在求解算法题中的应用
背景
前段时间,在知识星球立了一个Flag,这是总结Leetcode刷题的第三篇图文。
理论部分
Python list
的源码地址:
https://github.com/python/cpython/blob/master/Include/listobject.h
https://github.com/python/cpython/blob/master/Objects/listobject.c
C# List<T>
的源码地址:
https://referencesource.microsoft.com/#mscorlib/system/collections/generic/list.cs,cf7f4095e4de7646
通过阅读源码,我们发现 Python 的 list
与 C# 的 List<T>
一致都是通过动态数组的方式来实现的。Python 的内置结构中没有链表这种结构,而C# 的内置结构中封装了双向链表 LinkedList<T>
,内部结点为 LinkedListNode<T>
,源码地址如下:
https://referencesource.microsoft.com/#System/compmod/system/collections/generic/linkedlist.cs,df5a6c7b6b60da4f
LinkedListNode
public LinkedListNode<T> Next { get; }
- -> 获取下一个节点
public LinkedListNode<T> Previous { get; }
- -> 获取上一个节点
public T Value { get; set; }
- -> 获取或设置包含在节点中的值。
LinkedList
public LinkedListNode<T> AddFirst(T value);
- -> 添加包含指定的值的开头的新节点
public LinkedListNode<T> AddLast(T value);
- -> 添加包含指定的值的末尾的新节点
public LinkedListNode<T> AddBefore(LinkedListNode<T> node, T value);
- -> 添加包含在指定的现有节点前的指定的值的新节点
public LinkedListNode<T> AddAfter(LinkedListNode<T> node, T value);
- -> 添加包含指定的值中指定的现有节点后的新节点
public void AddFirst(LinkedListNode<T> node);
- -> 将指定的新节点添加的开头
public void AddLast(LinkedListNode<T> node);
- -> 将指定的新节点添加的末尾
public void AddBefore(LinkedListNode<T> node, LinkedListNode<T> newNode);
- -> 在指定的现有节点之前添加指定的新节点
public void AddAfter(LinkedListNode<T> node, LinkedListNode<T> newNode);
- -> 在指定的现有节点之后添加指定的新节点
public bool Remove(T value);
- -> 移除从指定的值的第一个匹配项
public void Remove(LinkedListNode<T> node);
- -> 移除指定的节点
public void RemoveFirst();
- -> 删除的开始处的节点
public void RemoveLast();
- -> 删除节点的末尾
public LinkedListNode<T> Find(T value);
- -> 查找包含指定的值的第一个节点。
public LinkedListNode<T> FindLast(T value);
- -> 查找包含指定的值的最后一个节点。
public void Clear();
- -> 删除所有节点
public int Count { get; }
- -> 获取中实际包含的节点数
public LinkedListNode<T> First { get; }
- -> 获取的第一个节点
public LinkedListNode<T> Last { get; }
- -> 获取的最后一个节点
public static void LinkedListSample()
{LinkedList<int> lst = new LinkedList<int>();lst.AddFirst(3);lst.AddLast(1);lst.AddLast(4);foreach (int item in lst){Console.Write(item+" "); }Console.WriteLine();LinkedListNode<int> cur = lst.Find(3);lst.AddBefore(cur, 2);foreach (int item in lst){Console.Write(item + " "); }Console.WriteLine();lst.Remove(3);foreach (int item in lst){Console.Write(item + " "); }Console.WriteLine();lst.Clear();
}// 3 1 4
// 2 3 1 4
// 2 1 4
应用部分
题目1:反转链表
- 题号:206
- 难度:简单
- https://leetcode-cn.com/problems/reverse-linked-list/
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
思路:利用双指针的方式
p1
作为前面的指针探路,p2
作为后面的指针跟进,顺着链表跑一圈,搞定问题。
C# 语言
- 状态:通过
- 27 / 27 个通过测试用例
- 执行用时: 116 ms, 在所有 C# 提交中击败了 97.50% 的用户
- 内存消耗: 23.3 MB, 在所有 C# 提交中击败了 5.26% 的用户
/*** Definition for singly-linked list.* public class ListNode {* public int val;* public ListNode next;* public ListNode(int x) { val = x; }* }*/public class Solution
{public ListNode ReverseList(ListNode head){if (head == null || head.next == null)return head;ListNode p1 = head;ListNode p2 = null;while (p1 != null){ListNode temp = p1.next;p1.next = p2;p2 = p1;p1 = temp;}return p2;}
}
Python 语言
- 执行结果:通过
- 执行用时:36 ms, 在所有 Python3 提交中击败了 92.27% 的用户
- 内存消耗:14.6 MB, 在所有 Python3 提交中击败了 17.65% 的用户
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = Noneclass Solution:def reverseList(self, head: ListNode) -> ListNode:if head is None or head.next is None:return headp1 = headp2 = Nonewhile p1 is not None:temp = p1.nextp1.next = p2p2 = p1p1 = tempreturn p2
题目2:删除链表的倒数第N个节点
- 题号:19
- 难度:中等
- https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/
给定一个链表,删除链表的倒数第n
个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的n
保证是有效的。
进阶:
你能尝试使用一趟扫描实现吗?
思路:利用双指针的方式
使用两个指针,前面的指针p1
先走n
步,接着让后面的指针p2
与p1
同步走,p1
走到终点,p2
即走到要移除的结点位置。
C# 语言
- 执行结果:通过
- 执行用时:104 ms, 在所有 C# 提交中击败了 86.93% 的用户
- 内存消耗:24.6 MB, 在所有 C# 提交中击败了 100.00% 的用户
/*** Definition for singly-linked list.* public class ListNode {* public int val;* public ListNode next;* public ListNode(int x) { val = x; }* }*/
public class Solution
{public ListNode RemoveNthFromEnd(ListNode head, int n) {ListNode p1 = head;ListNode p2 = head;while (n > 0){p1 = p1.next;n--;}if (p1 == null) //移除头结点{return head.next;}while (p1.next != null){p1 = p1.next;p2 = p2.next;}p2.next = p2.next.next;return head;}
}
Python 语言
- 执行结果:通过
- 执行用时:48 ms, 在所有 Python3 提交中击败了 23.58% 的用户
- 内存消耗:13.5 MB, 在所有 Python3 提交中击败了 7.83% 的用户
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = Noneclass Solution:def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:p2 = headp1 = headwhile (n > 0):p1 = p1.nextn -= 1if (p1 is None): # 移除头结点return head.nextwhile (p1.next):p2 = p2.nextp1 = p1.nextp2.next = p2.next.nextreturn head
题目3:删除排序链表中的重复元素
- 题号:83
- 难度:简单
- https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list/
给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。
示例 1:
输入: 1->1->2
输出: 1->2
示例 2:
输入: 1->1->2->3->3
输出: 1->2->3
思路:利用双指针的方式
p1
作为前面的指针探路,p2
作为后面的指针跟进,如果遇到重复元素,p2.next
跳过去,p1
跑完整个链表所有重复元素都被摘下来。
C# 语言
- 执行结果:通过
- 执行用时:160 ms, 在所有 C# 提交中击败了 5.23% 的用户
- 内存消耗:25.9 MB, 在所有 C# 提交中击败了 5.72% 的用户
/*** Definition for singly-linked list.* public class ListNode {* public int val;* public ListNode next;* public ListNode(int x) { val = x; }* }*/public class Solution
{public ListNode DeleteDuplicates(ListNode head){if (head == null)return head;ListNode p1 = head.next;ListNode p2 = head;while (p1 != null){if (p1.val == p2.val)p2.next = p1.next;elsep2 = p2.next;p1 = p1.next;}return head;}
}
Python 语言
- 执行结果:通过
- 执行用时:52 ms, 在所有 Python3 提交中击败了 33.88% 的用户
- 内存消耗:13.5 MB, 在所有 Python3 提交中击败了 12.75% 的用户
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = Noneclass Solution:def deleteDuplicates(self, head: ListNode) -> ListNode:if head is None:return headp1 = head.nextp2 = headwhile p1 is not None:if p1.val == p2.val:p2.next = p1.nextelse:p2 = p2.nextp1 = p1.nextreturn head
例题4:环形链表
- 题号:141
- 难度:简单
- https://leetcode-cn.com/problems/linked-list-cycle/
给定一个链表,判断链表中是否有环。
为了表示给定链表中的环,我们使用整数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
解释:链表中没有环。
进阶:
你能用 O(1)(即,常量)内存解决此问题吗?
思路:利用双指针的方式
通常情况下,判断是否包含了重复的元素,我们使用Hash
的方式来做。对于单链表的这种场景,我们也可以使用双指针的方式。
第一个指针 p1
每次移动两个节点,第二个指针 p2
每次移动一个节点,如果该链表存在环的话,第一个指针一定会再次碰到第二个指针,反之,则不存在环。
比如:head = [1,2,3,4,5]
,奇数
p1:1 3 5 2 4 1
p2:1 2 3 4 5 1
比如:head = [1,2,3,4]
,偶数
p1:1 3 1 3 1
p2:1 2 3 4 1
C# 语言
- 状态:通过
- 执行用时: 112 ms, 在所有 C# 提交中击败了 98.43% 的用户
- 内存消耗: 24.9 MB, 在所有 C# 提交中击败了 5.13% 的用户
/*** Definition for singly-linked list.* public class ListNode {* public int val;* public ListNode next;* public ListNode(int x) {* val = x;* next = null;* }* }*/
public class Solution {public bool HasCycle(ListNode head) {ListNode p1 = head;ListNode p2 = head;while (p1 != null && p1.next != null){p1 = p1.next.next;p2 = p2.next;if (p1 == p2)return true;}return false;}
}
Python 语言
- 执行结果:通过
- 执行用时:56 ms, 在所有 Python3 提交中击败了 60.97% 的用户
- 内存消耗:16.6 MB, 在所有 Python3 提交中击败了 11.81% 的用户
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = Noneclass Solution:def hasCycle(self, head: ListNode) -> bool:p1 = headp2 = headwhile p1 is not None and p1.next is not None:p1 = p1.next.nextp2 = p2.nextif p1 == p2:return Truereturn False
题目5:排序链表
- 题号:148
- 难度:中等
- https://leetcode-cn.com/problems/sort-list/
在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。
示例 1:
输入: 4->2->1->3
输出: 1->2->3->4
示例 2:
输入: -1->5->3->4->0
输出: -1->0->3->4->5
思路:模仿并归排序的思路,典型的回溯算法。
如果待排的元素存储在数组中,我们可以用并归排序。而这些元素存储在链表中,我们无法直接利用并归排序,只能借鉴并归排序的思想对算法进行修改。
并归排序的思想是将待排序列进行分组,直到包含一个元素为止,然后回溯合并两个有序序列,最后得到排序序列。
对于链表我们可以递归地将当前链表分为两段,然后merge,分两段的方法是使用双指针法,p1
指针每次走两步,p2
指针每次走一步,直到p1
走到末尾,这时p2
所在位置就是中间位置,这样就分成了两段。
C# 语言
- 状态:通过
- 16 / 16 个通过测试用例
- 执行用时: 124 ms, 在所有 C# 提交中击败了 100.00% 的用户
- 内存消耗: 29 MB, 在所有 C# 提交中击败了 25.00% 的用户
/*** Definition for singly-linked list.* public class ListNode {* public int val;* public ListNode next;* public ListNode(int x) { val = x; }* }*/public class Solution
{public ListNode SortList(ListNode head){if (head == null)return null;return MergeSort(head);}private ListNode MergeSort(ListNode node){if (node.next == null){return node;}ListNode p1 = node;ListNode p2 = node;ListNode cut = null;while (p1 != null && p1.next != null){cut = p2;p2 = p2.next;p1 = p1.next.next;}cut.next = null;ListNode l1 = MergeSort(node);ListNode l2 = MergeSort(p2);return MergeTwoLists(l1, l2);}private ListNode MergeTwoLists(ListNode l1, ListNode l2){ListNode pHead = new ListNode(-1);ListNode temp = pHead;while (l1 != null && l2 != null){if (l1.val < l2.val){temp.next = l1;l1 = l1.next;}else{temp.next = l2;l2 = l2.next;}temp = temp.next;}if (l1 != null)temp.next = l1;if (l2 != null)temp.next = l2;return pHead.next;}
}
Python 语言
- 执行结果:通过
- 执行用时:216 ms, 在所有 Python3 提交中击败了 75.99% 的用户
- 内存消耗:20.7 MB, 在所有 Python3 提交中击败了 28.57% 的用户
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = Noneclass Solution:def sortList(self, head: ListNode) -> ListNode:if head is None:return headreturn self.mergeSort(head)def mergeSort(self, node: ListNode) -> ListNode:if node.next is None:return nodep1 = nodep2 = nodecute = Nonewhile p1 is not None and p1.next is not None:cute = p2p2 = p2.nextp1 = p1.next.nextcute.next = Nonel1 = self.mergeSort(node)l2 = self.mergeSort(p2)return self.mergeTwoLists(l1, l2)def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:pHead = ListNode(-1)temp = pHeadwhile l1 is not None and l2 is not None:if l1.val < l2.val:temp.next = l1l1 = l1.nextelse:temp.next = l2l2 = l2.nexttemp = temp.nextif l1 is not None:temp.next = l1if l2 is not None:temp.next = l2return pHead.next
总结
本篇图文首先说明了 Python 语言中的list
不是链表而是一个动态数组,C# 语言中的List<T>
也是动态数组。Python 中没有提供链表这种结构,C# 中提供了双向链表的结构LinkedList<T>
。之后,我们通过五道Leetcode题目说明了双指针技术在链表问题中的应用,希望能够对大家有所帮助。目前 Flag 计划已经执行 60%,要努力,要努力!今天就到这里吧!See You!
当前活动
我是 终身学习者“老马”,一个长期践行“结伴式学习”理念的 中年大叔。
我崇尚分享,渴望成长,于2010年创立了“LSGO软件技术团队”,并加入了国内著名的开源组织“Datawhale”,也是“Dre@mtech”、“智能机器人研究中心”和“大数据与哲学社会科学实验室”的一员。
愿我们一起学习,一起进步,相互陪伴,共同成长。
后台回复「搜搜搜」,随机获取电子资源!
欢迎关注,请扫描二维码:
相关文章:

【CSON原创】HTML5游戏框架cnGameJS开发实录(外部输入模块篇)
返回目录 1.为什么我们需要外部输入模块? 在游戏中我们常常用到类似这样的操作:鼠标点击某位置,玩家对象移动到该位置,或者按鼠标方向键,玩家向不同方向移动,等等。这些操作无一不用与外部输入设备打交道。…

中国科协(深圳)海外人才离岸创新创业基地源创力中心开业,主打国际创业服务...
2017年9月28日,由深圳市科学技术协会主办、深圳市罗湖区人民政府支持,深圳市源创力离岸创新中心承办的“梧桐山基地开园仪式暨梧桐湾未来论坛”于深圳举办。 据介绍, “中国科协(深圳)海外人才离岸创新创业基地”是在深…

找java培训机构如何挑选
java技术在互联网行业的需求率还是非常高的,它的发展前景非常可观,想要学好java技术,那么寻找一个好的java培训机构是非常重要的,那么找java培训机构如何挑选呢?来看看下面的详细介绍。 找java培训机构如何挑选? 在选择…

技术图文:集合技术在求解算法题中的应用
背景 前段时间,在知识星球立了一个Flag,这是总结Leetcode刷题的第四篇图文。 理论部分 HashSet C# 语言中 HashSet<T> 是包含不重复项的无序列表,称为“集合(set)”。由于set是一个保留字,所以用HashSet来表示。 public…

sql server 2008数据导入Oracle方法
试了几种sql server数据导入Oracle的方法,发现还是sql server 的导入导出工具最好使。使用方法很简单,照着向导做就可以。不过使用中需要注意以下几点: 系统盘需要足够大。因为SSIS的临时文件都是生成在系统盘的,系统盘太小&#…

nginx+tomcat配置负载均衡集群
一、Hello world 1、前期环境准备 准备两个解压版tomcat,如何同时启动两个tomcat,方法如下: 首先去apache tomcat官网下载一个tomcat解压版。 解压该压缩包,生成n份tomcat 分别命名为 tomcat1,tomcat2, 然后…

参加UI设计培训要学多久
UI设计要学习的内容有很多,至于参加UI设计培训要学多久这个问题,要看你的学习能力和所在的UI设计培训机构都教些什么,我们来看看下面的详细介绍。 参加UI设计培训要学多久?千锋教育的课程大纲分享给大家参考学习一下: 阶段一&…

技术图文:C# 语言中的扩展方法
背景 前段时间,在知识星球立了一个Flag,在总结 Leetcode 刷题的第五篇图文时遇到了扩展方法 这个知识点,于是先总结一下。 1.扩展方法概述 扩展方法能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以…

如何在ToolBar中显示文字和图标,自定义图标大小,并和MenuItem关联
要注意以下几个方面,先后顺序未必正确,有可能多设几次 1.设置ToolBar可以显示文字ToolBar.ShowCaption : True;2.设置ToolButton大小ImageList.WidthImageList.Height3.设置菜单关联4.设置运行时显示图标(这个是关键)ToolButton.Menuitum.ImageIndex要保证MenuItem所在的MainMe…

C#程序调用cmd执行命令
酷小孩 原文 C#程序调用cmd执行命令 对于C#通过程序来调用cmd命令的操作,网上有很多类似的文章,但很多都不行,竟是漫天的拷贝。我自己测试整理了一下。 代码: string str Console.ReadLine();System.Diagnostics.Process p new …

Java虚拟机的内存空间有几种
Java虚拟机的内存空间有几种?(1)问题分析: JVM(虚拟机)的内存划分 不同的数据使用的是哪一块内存空间 (2)核心答案讲解: Java虚拟机有那几块内存空间: 1)栈内存:方法运行时所进入的内存,里面还会存储程序的…

技术图文:排序技术在求解算法题中的应用
背景 前段时间,在知识星球立了一个Flag,这是总结Leetcode刷题的第五篇图文。 理论部分 C# 中的排序 对集合类的排序,我们通常使用位于 System.Core 程序集,System.Linq命名空间下,Enumerable静态类中的扩展方法。 …

如果有电脑——计算机达人成长之路(36)
5、电脑情缘(一)王新华的电脑 现在的大学生一般都有一个工具,就是计算机,尤其是计算机科学系的学生,几乎人手一台。对此,木鸿飞只能深深的说上一句:“幸福啊!” 现在人可能不能了解这…

Javascript中二进制数据处理方法
Javascript中二进制数据处理方法 转载于:https://www.cnblogs.com/motadou/archive/2012/02/19/2358514.html

正规Java培训机构是什么样的
正规Java培训机构是什么样的?这对于很多想真正学习到java技术的人来说是非常重要的,选择一个适合自己的靠谱的Java培训机构,学有所成工作也是比较稳定的,下面我们来看看详细的介绍。 正规Java培训机构是什么样的?其实对于这个问题…

《40期》 我们要把世纪末日变成重生日
2012年.传说中一个会是世纪末日的一年。(ps:电影看多了……- _-!!!),但是寒假过后的北京。天气却是十分的晴朗、出奇的好。而就在今天也就是2012年2月9日40期的开班典礼就选了这一天。地点就是在育荣教学园区2栋教学楼…

LeetCode刷题宝典 V1.0 PDF下载
前段时间,在知识星球立了一个Flag,现在 Flag 的进度为 100%,很是开心。 为了大家学习的方便,所以整理了这份150多页的小册子。可以作为学习数据结构与算法或备考计算机类研究生的参考资料,希望对大家有所帮助。 小册子…

机器学习:信用风险评估评分卡建模方法及原理
#课程介绍 信用风险评分卡为信用风险管理提供了一种有效的、经验性的解决方法,是消费信贷管理中广泛应用的技术手段。 评分卡是信用风险评估领域常见的建模方法。评分卡并不加单对应于某一种机器学习算法,而是一种通用的建模框架,讲原始数据通…

0基础学怎么学习python
Python相对于其他编程语言来说是比较简单的,非常适合零基础的小白学习,想要进入到互联网行业,可以优先选择学习Python,那么下面小编就来为大家详细的介绍一下0基础学怎么学习python? 0基础学怎么学习python? 1、要读书…

nginx技术(2)nginx的配置详解
nginx的配置 1,启动nginx 1234567[rootcentos6 nginx-1.2.9]# /usr/sbin/nginx -c /etc/nginx/nginx.conf 启动nginx [rootcentos6 nginx-1.2.9]# ps -ef|grep nginx 查看进程 root 5479 1 0 04:15 ? 00:00:00 nginx: master process /usr/sbin/nginx -…

javascript 基础篇2 数据类型,语句,函数
文章里如果有错误的话,希望能帮忙指正~我也是边看视频边学习中,这个算是个笔记吧~自认为总结出来的东西比看视频要节省点时间~能帮到别人最好了~帮不到也起码恩能帮到我自己 嘿~ 写内容之前废话一句:因为旧版有些浏览器不支持javascript脚本&…

技术图文:如何在Python中定义二维数组?
背景 前几天,有位同学问我如下的问题: “temp[0][0]修改后,为什么temp[1][0]、temp[2][0]也发生了变化?” “在Python中二维数组是怎样定义和使用的?” 今天就来谈谈这个问题。 技术分析 在 C# 语言中有直接定义二…

javascript的垃圾回收机制指的是什么
定义:指一块被分配的内存既不能使用,又不能回收,直到浏览器进程结束。 像 C 这样的编程语言,具有低级内存管理原语,如 malloc()和 free()。开发人员使用这些原语显式地对操作系统的内存进行分配和释放。 而 JavaScript…

技术图文:Matlab向量 VS. Python列表
背景 前段时间在知识星球上立了一个Flag,至少写10篇关于 Python,Matlab 和 C# 对比的总结。这是第 1 篇,从创建结构、添加元素、删除元素、获取元素四个角度来对比 Matlab 的向量与 Python 的列表。 1. 向量/列表 的创建 1.1 直接法 Matla…

我的ExtJS学习之路 ——4
项目基本架子出来,然后就该考虑将封装好的gridpanel 和 tabpanel关联起来 既 点击树的叶子节点,将 gridpanel 展现在 tabpanel中 怎么关联呢? 【在之前的基础上的,重复的代码就不贴出来了】 我改变了 模拟数据的形式,注…

php CI框架输出空行问题排查
今天在使用 curl 命令行工具调试一个功能时,发现输出的内容总是会在最开始莫名其妙的多一行空行: 项目框架是 php 的 CodeIgniter,感觉这种问题在网上不好查找,因为可以确定这个是业务出现的问题,然后只能自己去定位查…

哪些人适合学习软件测试
软件测试相对于其他编程语言来说,它的入门门槛是相对比较低的,想要从事IT互联网行业可以选择学习软件测试,那么都有哪些人适合学习软件测试呢?来看看下面的详细介绍吧。 哪些人适合学习软件测试?就在软件测试培训行业观察来看,小…

c语言基本函数
一.内存操作函数: (1) 头文件:#include <string.h>memset() 函数用来将指定内存的前n个字节设置为特定的值,其原型为: void * memset( void * ptr, int value, size_t num );参数说明:…

技术图文:Python 匿名函数 VS. C# Lambda表达式
背景 前段时间在知识星球上立了一个Flag,至少写10篇关于 Python,Matlab 和 C# 对比的总结。 这是第 2 篇,从定义和应用两个角度来对比 Python 的匿名函数 与 C# 的Lambda表达式。 匿名函数/Lambda表达式的定义 Python 匿名函数 在 Python…

php是否区分大小写
按常理来说,大多数语言都是区分大小写的,比如变量 ab 和 AB 是不同的,函数cd 和 CD 也是不同的,但是php有点特别。 首先,php中的变量和常量是区分大小写的。 <?php$a a; $A A; echo $a; echo $A;?>这里打印了…