比方說,我有int陣列:[1, 2, 4, 9, 5, 6, 8, 7]。我有第二個陣列,[8, 7, 6]. 我想知道的是,第一個陣列是否以與第二個陣列相同的值結尾,不一定以相同的順序結束?(在這種情況下,結果應該是true。)
可以依賴的不變數:
array1.Length > array2.Length- 中的所有元素
array1都是獨一無二的。 - 中的所有元素
array2都是獨一無二的。
回答這個問題最簡單的方法是什么?如果有一個不需要任何分配的合理有效的解決方案,那就太好了。
uj5u.com熱心網友回復:
您可以通過這種方式獲得簡單的 O(nlogn) 復雜度(n = array2 的大小):
- 排序陣列2
- 對array1的最后n個元素進行排序
- 逐個元素比較array2和array1的最后n個元素
這應該是您無需任何額外分配就可以做的最好的事情
uj5u.com熱心網友回復:
我認為 LINQ 是最簡單的方法:
using System.Linq;
bool EndsWithSubset(int[] array1, int[] array2)
{
return array1
.TakeLast(array2.Length)
.ToHashSet()
.SetEquals(array2);
}
用法示例:
Console.WriteLine(
EndsWithSubset(
new [] { 1, 2, 4, 9, 5, 6, 8, 7 },
new [] { 8, 7, 6 }
)); // True
uj5u.com熱心網友回復:
您可以在Linq的幫助下查詢陣列。在這里,我們利用所有值都是唯一的(無重復)這一事實:
bool contains = !array1
.Skip(array1.Length - array2.Length)
.Except(array2)
.Any();
在這里,我們
- 在幫助下獲得
array1后綴.Skip(array.Length - array2.Length) - 減去
array2與.Except(array2) - 然后檢查是否還有任何專案 -
.Any()
uj5u.com熱心網友回復:
如果第二個陣列通常不那么長,您可以對兩個序列進行排序并比較元素。如果它很長,排序的成本可能很高,使用哈希集會更有效。
bool endsEqual = arr1.TakeLast(arr2.Length)
.OrderBy(i => i)
.SequenceEqual(arr2.OrderBy(i => i));
uj5u.com熱心網友回復:
嘗試這個。恕我直言,這將是最簡單和最快的,因為它不需要從 Linq 翻譯,也不需要任何分配。一切都計算在一次通過中。如果 arr1 具有重復數字(只需洗掉中斷),則該演算法也將起作用。
var startIndex = arr1.Length - arr2.Length;
var count=startIndex;
for (var i = 0; i < arr2.Length; i )
for (var j = startIndex; j < arr1.Length; j )
if (arr1[j] == arr2[i]) { count ; break; }
var isContaining = count==arr1.Length;
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/318689.html
