我需要从两个非重复序列(数组)中交换前n个元素,其中n是一个随机整数。
Seq1:1 4 5 6 9 8 2 3 7
Seq2:3 9 1 2 8 7 4 5 6
如果n = 4
Seq1:3 9 1 2 | 9 8 2 3 7
Seq2:1 4 5 6 | 8 7 4 5 6
现在我需要通过替换'|'之后重复的数字来修复序列。
怎么做?
这是我的努力..
for(left1 = 0; left1<pivot; left1++)
{
for(right1 = pivot; right1 < no_jobs; right1++)
{
if(S1->sequence[left1] == S1->sequence[right1])
{
for(left2 = 0; left2<pivot; left2++)
{
for(right2 = pivot; right2<no_jobs; right2++)
{
if(S2->sequence[left2] == S2->sequence[right2])
{
swap_temp = S1->sequence[right1];
S1->sequence[right1] = S2->sequence[right2];
S2->sequence[right2] = swap_temp;
break;
}
}
}
}
}
}
答案 0 :(得分:1)
使用单个for循环交换前n个元素非常简单。
for(int i = 0; i < n; i++){
int tmp = array1[i];
array1[i] = array2[i];
array2[i] = tmp;
}
现在您需要找到数组中已更改的内容。您可以通过比较交换的部分来完成此操作。
int m1 = 0, m2 = 0;
int missing_array1[n];
int missing_array2[n];
for(int i = 0; i < n; i++){
bool found = false;
for(int j = 0; j < n; j++){
if(array1[i] == array2[j]){
found = true;
break;
}
}
if(!found){
missing_array2[m2++] = array1[i];
}
}
for(int i = 0; i < n; i++){
bool found = false;
for(int j = 0; j < n; j++){
if(array2[i] == array1[j]){
found = true;
break;
}
}
if(!found){
missing_array1[m1++] = array2[i];
}
}
missing_array2现在包含array2中缺少的数字。这些是将在array1中重复的所有数字。对于missing_array1也是如此。接下来,您需要扫描两个阵列并用缺少的数字替换重复项。
while(m1 >= 0){
int z = 0;
while(missing_array1[m1] != array2[n + z]){
z++;
}
array2[n + z] = missing_array2[m1--];
}
while(m2 >= 0){
int z = 0;
while(missing_array2[m2] != array1[n + z]){
z++;
}
array1[n + z] = missing_array1[m2--];
}
总之,您比较交换的部分以查找每个数组中缺少的值。这些值也是将在相反数组中重复的值。然后扫描每个数组并用一个缺失值替换重复值(假设您不关心哪个缺失值,只要所有值都是唯一的。
答案 1 :(得分:0)
如果序列的交换部分包含相同的值,那么就不会重复 - 执行交换只会改组前n个元素。因此,您需要修复的值是其中一个交换序列中出现的值
首先,我创建了n个交换元素的直方图,序列1的直方图计为位0,序列2的直方图计为位1.如果直方图的任何成员非零,则发生只在一个或另一个序列中。
如果存在需要修复的值,则可以构建需要重写的值的查找表。这应该将i映射到i,除非i是直方图中的非对称值之一,在这种情况下,它需要映射到另一个非对称值。
Seq1: 1 4 5 6 9 8 2 3 7
Seq2: 3 9 1 2 8 7 4 5 6
如果n = 4
Seq1: 3 9 1 2 | 9 8 2 3 7
Seq2: 1 4 5 6 | 8 7 4 5 6
直方图
value 1 2 3 4 5 6 7 8 9
count 3 1 1 2 2 2 0 0 1
序列1的映射(直方图[S1 [i]]&amp; 1,将[S1 [i]]替换为S2 [i])
value 1 2 3 4 5 6 7 8 9
replace 1 6 5 4 5 6 7 8 4
将映射应用于序列1 for i&gt; n
Seq1: 3 9 1 2 | 9 8 2 3 7
replace - - - - | 4 8 6 5 7
result 3 9 1 2 | 4 8 6 5 7
序列2的映射(直方图[S2 [i]]&amp; 2,将[S2 [i]]替换为S1 [i])
value 1 2 3 4 5 6 7 8 9
replace 1 2 3 9 3 2 7 8 9
将映射应用于序列1 for i&gt; n
Seq2: 1 4 5 6 | 8 7 4 5 6
replace - - - - | 8 7 9 3 2
result 1 4 5 6 | 8 7 9 3 2
或者,用直方图中设置的其他位替换下一个值(迭代替换也需要检查是否用自身替换值);我假设只要结果中的值是唯一的,用什么值作为替换值并不重要。