需要帮助逻辑(C)

时间:2010-07-01 16:11:29

标签: c arrays logic swap

我需要从两个非重复序列(数组)中交换前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;
            }
          } 
        }
      }
    }
  }

2 个答案:

答案 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

或者,用直方图中设置的其他位替换下一个值(迭代替换也需要检查是否用自身替换值);我假设只要结果中的值是唯一的,用什么值作为替换值并不重要。