gpt4 book ai didi

比较 C 中的两个数组值

转载 作者:太空宇宙 更新时间:2023-11-04 06:48:05 26 4
gpt4 key购买 nike

我正在用 C 语言为学校项目编写一个程序,该程序比较两个数组的值并根据用户的输入给出具体结果。基本上我的输出值有两个,correctPositioncorrectValue

例如,

correctValue 是一个在 valuesArray 中但不在 inputArray 中正确位置的值;值“4”位于 valuesArray 的索引 1,但位于 inputArray 的索引 2。

correctPosition 是在 valuesArrayinputArray 中位于相同索引处的值。例如;值“3”位于 valuesArrayinputArray

的索引 1

如果两个数组之间的 x 值匹配,则它可以是 correctValue 或 correctPosition。这是一个视觉表示:

valuesArray: 2 3 3
------------------
inputArray: 1 2 3
Answer: correctPosition = 1, correctValue = 1.

inputArray: 2 1 3
Answer: correctPosition = 2, correctValue = 0.

inputArray: 2 3 3
Answer: correctPosition = 3, correctValue = 0.

这是我为此编写的代码:

#include <stdio.h>

int main() {

int inputArray[3], valuesArray[3];
int correctNumber = 0, positionMatch = 0;
int x, y;
int visitedMatch[3];

valuesArray[0] = 2;
valuesArray[1] = 3;
valuesArray[2] = 3;
inputArray[0] = 1;
inputArray[1] = 2;
inputArray[2] = 3;

for( x = 0; x < 3; x++) {
visitedMatch[x] = 0;
}

for(x = 0; x < 3; x++) {
for(y = 0; y < 3; y++) {
if (inputArray[x] == valuesArray[y] && visitedMatch[y] == 0) {
if (x == y) { positionMatch++; } else { correctNumber++; }
visitedMatch[y] = 1;
break;
}
}
}

printf("correctPosition = %d, ", positionMatch);
printf("correctValues = %d\n", correctNumber);
return 0;
}

问题是对于输入 1 2 3,它首先取 1 并检查 valuesArray 但找不到任何东西,因此结果保持为 0。然后在 x = 1 的第二次迭代中,它取 2 并检查它是否在数组但不在正确的索引处,因此 correctValue 计数器变为 1。现在在 x = 2 的最后一次迭代中,它需要 3 并通过循环并在索引 2 处找到第一个值“3”,因为它之前从未访问过,所以最终结果变成 correctPosition = 0,correctValue = 2。如果我将输入写为 2 3 3,那么它工作正常并且输出是 correctPosition = 3,correctValue = 0。我该如何解决这个问题,我错过了什么在这里?

任何帮助将不胜感激。

最佳答案

正如我在评论中所写,我建议采用不同的方法。你的算法有点不整洁,因为从逻辑上讲,positionMatch 贡献者的评估涉及将每个输入值与一个对应的其他位置进行比较,而 valueMatch 贡献者的评估涉及比较每个输入对整个董事会的值(value)。

如果分开,这些会更干净。如果您不得不担心处理非常大的电路板,那么将这两个步骤分开可以产生一种解决方案,其成本与电路板的尺寸呈线性关系而不是二次方关系。具体来说,我建议的方法是

  1. 扫描两个数组一次以计算 positionMatch 计数并为每个数组构建每个符号出现次数的直方图。

  2. 扫描两个直方图,为每个符号计算两个直方图中该符号计数的最小值之和。这会产生正确数字的总数,但不会区分正确位置和错误位置的数字。

  3. 从 (2) 中计算的总和中减去 (1) 中计算的 positionMatch 得到 correctNumber

不过,话虽如此,您应该能够调整当前代码以计算出正确的结果。缺少的主要内容是避免使用本应提供 positionMatchvaluesArray 元素来提供 correctNumber。但这是您可以测试的情况。当您检测到匹配项时 (inputArray[x] == valuesArray[y] && visitedMatch[y] == 0),您目前会执行仅有的两个备选方案之一,具体取决于 x = = y。要正确计算计数,您应该改为使用三个:

  • 如果 x == y 则递增 positionMatch 并从内部循环中断。 (你也可以标记访问过的位置,但你不需要这样做。)
  • 否则,如果 inputArray[y] == valueArray[y]什么都不做valueArray 的那个元素已经或将有助于 positionMatch,因此它不应有助于 correctNumber。继续下一个内循环迭代。
  • 否则递增correctNumber,标记位置y已访问,并从内循环中跳出

或者,您可以调整当前的方法来模拟我建议的方法,而无需实际构建物理直方图。需要进行这些更改:

  • 在外循环中,判断是否递增positionMatch。以任何一种方式继续内循环。
  • 在内部循环中,忽略是否 x == y,而是递增 correctNumber 并在找到匹配项时标记访问的位置。这是计算和评估直方图的替代方法。
  • 最后,在报告结果之前,从 correctNumber 中减去 positionMatch

关于比较 C 中的两个数组值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55304761/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com