【问题标题】:How do I find the length of the longest run in my array?如何找到数组中最长运行的长度?
【发布时间】:2013-06-05 16:20:21
【问题描述】:

我正在尝试编写一个程序来返回一个整数值,该整数值表示最长的重复数字的长度。 (例如,整数数组,例如 2、4、4、1、3、4、4、4、4、4、6、6、6 将返回值 5,因为 5 个 4 是最长的运行。)我已经尝试编写代码,但它一直返回我数组中的元素总数。怎么了?

int length(int array[], int size)
{
   int x = 0, max;
   int result[size];

   for (int i = 0; i < size; i++)
   {
      x = i + 1;

      if (array[i] == array[x])
      {
         result[i] = x + 1;
      }

      if (result[i] > result[x])
      {
         max = result[i];
      }
   }

   return max;
}

【问题讨论】:

  • 作为提示 - 您可能希望同时跟踪当前计数和单独的“迄今为止我见过的最大计数”。如果您需要更详细的答案,请告诉我。
  • 一个 max() 函数应该这样做
  • 您需要一个数组来存储每个数字的计数,而不仅仅是一个特定的。
  • 你可以对你的数组进行排序,如果你的整数范围很小,计数排序是一个不错的选择
  • @Nile 你想到的是 C++ 而不是 C

标签: c arrays integer


【解决方案1】:

此代码考虑整数的运行,并返回最大运行长度。

int length(int array[], int size) {
   int max = 1;
   int current = 1;
   int i;

   for (i = 1; i < size; i++) {
      if (array[i - 1] == array[i]) {    /* the run continues */
          current++;
          max = current > max ? current : max;
      } else {    /* the run was broken */
          current = 1;
      }
   }
   return max;
}

【讨论】:

  • 谢谢!快速提问,为什么 n 被设置为 array[0]?难道我们不能说:if (array[i] == array[i + 1])?为什么我们在 else 语句的最后部分说:n = array[i]?
  • 我想我没有很好地评论变量。我使用n 来表示我当前的号码。
  • 这假定数组是排序的......这一事实的辨别超出了 OP 当前的专业水平,因此说明这一点很重要。请注意,thejh 已经给出了一个对排序数组进行操作的答案......并这么说。 (但这段代码更好一些。)
  • 其实不错的电话。 n 并不是真正需要的。我已经重构了代码并删除了它。
  • 非常感谢您的帮助!我认为这是我最清楚的答案/最容易理解的答案。 :) 但是感谢所有帮助过的人!我很感激。 :)
【解决方案2】:

正如 nachokk 所说,首先对值进行排序。之后,您可以执行以下操作:

int max(int a, int b) { return a>b ? a : b; }

int get_highest_repetitition_length(int arr[], int arr_len) {
  int len = 0, highest_len = 0;
  for (int i=0; i<arr_len; i++) {
    if (i>0 && arr[i-1] != arr[i]) {
      highest_len = max(len, highest_len);
      len = 0;
    }
    len++;
  }
  highest_len = max(len, highest_len);
  return highest_len;
}

【讨论】:

  • 有没有办法在不先对值进行排序的情况下做到这一点?而且我不允许使用 max() 函数。 :(顺便说一句,这不是作业,我只是在练习。:)
  • @Karen:我可以想出一种无需排序的简单方法,但那会产生一个非常复杂的O(n^2) 类。而且,呃,请随意将highest_len = max(len, highest_len); 替换为if (len &gt; highest_len) highest_len = len; 或其他任何东西。
  • @Karen 如果这不是家庭作业,那么谁不允许你使用 max?请注意,此答案提供了自己的 max 函数...您不允许编写函数吗?编写名为 max 的函数?编写找到两个参数中最大值的函数?我不知道这些限制中的哪一个是强加给你的,但它们都不是明智的或与编程技巧有任何关系。至于没有排序的方法:当然,但它们需要一个查找表来将整数映射到它们的计数(这将需要 O(n*n),除非查找是 O(n))。
  • 哦,问题要我写一个函数来解决。
  • @Karen 那么问题是需要糟糕的编程实践......我建议找到更好的问题来源。
【解决方案3】:

希望这会有所帮助。如果你想在不排序的情况下得到结果,你需要知道输入中数字的范围。假设范围是从[0 , size)

int get_max_rep(int array[], int size) 
{
int* counter = (int *)malloc(sizeof(int)*size);    
// initialize
for (int i = 0; i < size; ++i) {
  counter[i] = 0;
}

int max = 0;
for (int i = 0; i < size; ++i) {
  ++counter[array[i]];
  if(max < counter[array[i]])
    max = counter[array[i]];
}
free(counter);
return max;
}

如果范围是 [a, b), a counter 的大小成为问题,那么您可以使用位向量作为替代方案。

【讨论】:

  • 不,你不需要知道数字的范围......尤其是你的代码所用的语言不是 C,因此这个答案是 -1
  • 抱歉使用新/删除。但是,我仍然认为,需要知道数字的范围才能正确计算最大重复数。
  • 所以没有可变大小的容器?在 C++ 中没有 vector 或在 C 中没有 realloc
  • 事实证明,这是一个与 OP 打算提出的问题完全不同的问题的解决方案。
猜你喜欢
  • 2011-05-05
  • 1970-01-01
  • 2020-03-22
  • 2020-07-27
  • 2021-10-26
  • 1970-01-01
  • 1970-01-01
  • 2022-01-05
相关资源
最近更新 更多