判断数组末尾是否包含另一数组所有元素(顺序不限)的最简方法
数组尾部包含性判断方案
前提约束(题目给定可直接依赖)
array1.Length > array2.Lengtharray1中所有元素唯一array2中所有元素唯一
最简实现
基于.NET Span和LINQ实现,代码极简易维护,无显式堆内存分配:
using System.Linq; public static bool IsTailContains(int[] array1, int[] array2) { var tailSpan = array1.AsSpan(array1.Length - array2.Length); return array2.All(tailSpan.Contains); }
零分配高性能实现
完全避免委托、堆对象分配,适合高性能场景,时间复杂度为O(m²),其中m为array2长度:
public static bool IsTailContainsOptimized(int[] array1, int[] array2) { int matchCount = 0; int tailStart = array1.Length - array2.Length; foreach (var target in array2) { for (int i = tailStart; i < array1.Length; i++) { if (array1[i] == target) { matchCount++; break; } } } return matchCount == array2.Length; }
补充说明:因为两个数组元素都唯一,所以不会出现重复匹配计数的问题,只要匹配次数等于
array2的长度,就说明array1尾部完全包含array2的所有元素,不需要考虑顺序。如果array2长度较大(超过32),也可以用栈分配的哈希集合优化到O(m)时间复杂度,进一步提升性能。
内容的提问来源于stack exchange,提问作者Mason Wheeler
相关产品推荐
相关产品推荐

