我的代码:
reserve
我有unpermute数组,进行深层复制,然后,如果var unpermuted = new byte[]{137, 208, 135, 4, 191, 255, 132, 99, 85, 54, 58, 137, 208, 37, 151, 30};
var longKey = new byte[] {75, 79, 84, 69, 197, 129, 75, 65, 74, 65, 75, 75, 79, 84, 69, 197, 129, 75, 65, 74, 65};
var permuted = (byte[])unpermuted.Clone();
for(var i = 0; i < permuted.Length;i++)
{
if (i > 1 && (permuted[i] < longKey[i]))
{
var swapCont = permuted[i - 1];
permuted[i - 1] = permuted[i];
permuted[i] = swapCont;
}
}
printArr(unpermuted);
Console.WriteLine();
printArr(permuted);
// How do I reverse permuted array to unpermuted?
Console.WriteLine();
printArr(permuted);
}
public static void printArr(byte[] arr)
{
for(var i = 0; i < arr.Length;i++)
{
Console.Write(arr[i]);
Console.Write(" ");
}
}
高于value,我将与之前的元素交换。
问题是: 如何将置换数组恢复为仅具有 LongKey数组和Permuted数组的无数形式?
答案 0 :(得分:1)
根据你拥有的信息,不可能“取消”数组。
想象一下,你有以下几点:
longkey = [1,2,3,9,5]
array = [3,4,9,5,6]
运行代码,结果将为[3,4,5,9,6]
。
但如果原始数组是[3,4,5,9,6]
,结果是相同的。
正如您所看到的,原始数组有多个排列可以提供相同的输出。结果中没有足够的信息,longkey
数组告诉你原始数组是什么。
一般情况下,如果您在以下任何地方都有3项序列,那么就不可能可靠地反转操作。
longkey = [b, c, d]
array = [x, y, z]
其中:
b <= x, b <= y
c < x, c > y
d <= z
例如:
longkey = [...,3,9,5,...]
array = [...,9,5,6,...]
这里的关键是9永远不能与左边的东西交换,6永远不会与5交换。所以5和9不能移动,除了互相交换位置。如果原始订单为[9,5,6]
,则最终订单为[5,9,6]
。如果原始订单为[5,9,6]
,则结果再次为[5,9,6]
。