- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在用 C 语言为学校项目编写一个程序,该程序比较两个数组的值并根据用户的输入给出具体结果。基本上我的输出值有两个,correctPosition 和 correctValue。
例如,correctValue 是一个在 valuesArray 中但不在 inputArray 中正确位置的值;值“4”位于 valuesArray 的索引 1,但位于 inputArray 的索引 2。
correctPosition 是在 valuesArray 和 inputArray 中位于相同索引处的值。例如;值“3”位于 valuesArray 和 inputArray
的索引 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)。
如果分开,这些会更干净。如果您不得不担心处理非常大的电路板,那么将这两个步骤分开可以产生一种解决方案,其成本与电路板的尺寸呈线性关系而不是二次方关系。具体来说,我建议的方法是
扫描两个数组一次以计算 positionMatch
计数并为每个数组构建每个符号出现次数的直方图。
扫描两个直方图,为每个符号计算两个直方图中该符号计数的最小值之和。这会产生正确数字的总数,但不会区分正确位置和错误位置的数字。
从 (2) 中计算的总和中减去 (1) 中计算的 positionMatch
得到 correctNumber
。
不过,话虽如此,您应该能够调整当前代码以计算出正确的结果。缺少的主要内容是避免使用本应提供 positionMatch
的 valuesArray
元素来提供 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/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!