如何仅合并两个单独数组的唯一编号?

问题描述 投票:0回答:1

我真的需要帮助,因为这个练习让我发疯。

我们必须合并两个单独的、已排序的数组。然而,第三个数组只能包含每个数组唯一的数字,因此如果两个数组中都有一个数字,则不允许显示。

我已经坐在这里好几天了,我尝试了一切可能的方法,但我确实想不出解决方案。我真的快绝望了。我知道如何合并两个已排序的数组,但我不知道如何只能添加唯一的数字。

示例:

a1 = (1, 2, 3, 4, 4, 4, 5, 5, 6) a2 = (1, 4, 7, 9) a3 = (2, 3, 5, 5, 6, 7, 9)
到目前为止我的代码如下:

PROGRAM MergeArraysProgram; PROCEDURE MergeArrays(a1: ARRAY OF INTEGER; n1: INTEGER; a2: ARRAY OF INTEGER; n2: INTEGER; VAR a3: ARRAY OF INTEGER; VAR n3: INTEGER); VAR i: INTEGER; j: INTEGER; BEGIN n3 := 0; i := 0; j := 0; FOR i := 0 TO n1-1 DO BEGIN FOR j := 0 TO n2-1 DO BEGIN IF a2[j] = a1[i] THEN BEGIN a2[j] := a2[j+1]; END; END; END; i := 0; j := 0; WHILE (i < n1) AND (j < n2) DO BEGIN IF a1[i] < a2[j] THEN BEGIN a3[n3] := a1[i]; n3 := n3 + 1; i := i + 1; END; IF a1[i] > a2[j] THEN BEGIN a3[n3] := a2[j]; n3 := n3 + 1;; j := j + 1; END; IF (i < n1) AND (j < n2) AND (a1[i] = a2[j]) THEN BEGIN i := i + 1; j := j + 1; END; END; WHILE (i < n1) DO BEGIN a3[n3] := a1[i]; n3 := n3 + 1; i := i + 1; END; WHILE (j < n2) DO BEGIN a3[n3] := a2[j]; n3 := n3 + 1; j := j + 1; END; END;
我什么也想不起来了。我的头已经痛了,我在网上找不到任何相关内容,至少我不明白它或者它有一个完全不同的上下文。

如果有人能给我提示或帮助我,我将非常感激。 我会失去理智

freepascal
1个回答
0
投票
这是算法中的第一个问题:

IF (i < n1) AND (j < n2) AND (a1[i] = a2[j]) THEN BEGIN i := i + 1; j := j + 1; END;
如前所述:

在 3 种情况下,你知道某个东西是重复的:a1[i]=a2[j]、a1[i]=a1[i+1]、a2[j]=a2[j+1]。 – 马克·兰塞姆 昨天评论了

所以在这里,你要做的就是添加一个新的 var , 例子:

var k : integer; IF (i < n1) AND (j < n2) AND (a1[i] = a2[j]) THEN BEGIN k:= a1[i]; while (k=a1[i]) do i+=1; while (k=a1[j]) do j+=1; END;
你的问题不会得到解决,但我想它会帮助你解决它

© www.soinside.com 2019 - 2024. All rights reserved.