【问题标题】:Find runs of consecutive values in int array在 int 数组中查找连续值的运行
【发布时间】:2015-10-09 07:32:40
【问题描述】:

假设我有这个由独立整数元素组成的整数数组:

111100010011010

我想知道这个数组中是否存在0000,显然不存在,但是000 存在。其他长度的连续运行也是如此。

我知道这很容易用字符串完成,有内置的函数,但是有没有内置的东西可以完成我想做的事情?

或者我忽略了另一种简单的方法?我能想到的只是复杂的非高效算法,遍历数组并将值保存在一个临时的其他数组中。

【问题讨论】:

  • 你想解决什么问题,比如在更高的层次上? “元素”是什么意思?这些只是位,还是它们是单独的整数?您的查询0000 总是 是否是一系列相同的数字(例如可以描述为{ digit_value, count })?您的搜索查询可以是010111 吗?你知道移位和&|等按位运算吗?
  • int array = {1, 1, 0, 0, ...} 这些是数组中单独的整数元素,全部为 1 或 0。在更高级别上,我想检查给定序列是否为最大长度序列。我只是想开始检查0000 是否存在于 4 长度的 MLS 中,而 MLS 一定不存在。我确实知道按位运算。
  • 目前还不清楚您要达到的目标。您是否要查找最长的运行或检查给定运行的存在或找出给定的运行是否是最长的运行或其他?将您的非高效算法呈现为代码可能会更好。
  • 现在我只想检查这个序列中是否存在“0000”。我还没有把我的算法写成代码,但如果它有帮助,这就是我最终想要实现的目标:en.wikipedia.org/wiki/Maximum_length_sequence#Run_property

标签: c++ arrays search


【解决方案1】:

无需将值保存到临时数组。

您需要做的就是跟踪找到的最大长度(最初为零)及其第一个元素的位置(如果您使用指针来指示,则最初为 NULL)。

然后遍历数组,直到找到感兴趣的值。计算连续出现的次数。如果该数字超过找到的最大长度,请将位置设置为指向找到的第一个。

重复直到到达数组末尾。

完成。如果找到的最大长度为零,则表示没有出现所寻找的值。

不,我不会为上述内容编写代码。方法的描述就足够了。

还有很多使用标准算法的替代选项

【讨论】:

  • 这是一个非常简单的算法和 O(n) 复杂度。没有比这更好的了:)
  • 谢谢,这比我想象的要简单!这也回答了我的问题,如果有 C++ 内置的东西可以实现这一点。
【解决方案2】:

为了记录,另一种方法是使用std::search

#include <algorithm>
using namespace std;

const int elements[] = { 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0 };
const int test1[] = { 0, 0, 0, 0 };
const int test2[] = { 0, 0, 0 };

auto it1 = std::search(begin(elements), end(elements), begin(test1), end(test1));
auto it2 = std::search(begin(elements), end(elements), begin(test2), end(test2));

std::cout << "Test 0000: " << (it1 == end(elements) ? "no" : "yes") << "\n";
std::cout << "Test 000: " << (it2 == end(elements) ? "no" : "yes") << "\n";

打印出来:

Test 0000: no
Test 000: yes

如果您的数组是标准容器,例如 std::array 或向量,则更容易。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-16
    • 2017-07-03
    • 1970-01-01
    • 1970-01-01
    • 2011-12-18
    • 2014-09-13
    • 2011-07-21
    • 1970-01-01
    相关资源
    最近更新 更多