【问题标题】:Algorithm for determining max increasing sequence in an array确定数组中最大递增序列的算法
【发布时间】:2020-04-16 16:23:02
【问题描述】:

我正在 Coursera 学习 C 语言课程,在那里我遇到了一个作业,要求我编写一段代码,该代码可以判断数组中的最大递增序列。例如,对于数组{3,5,0,7,8,9},它应该返回我三个作为最大值。我写了两段代码,我认为它们都应该能够通过。但是,只有其中一个人这样做了,我不知道为什么。

这是第一段通过的代码:

#include <stdio.h>
#include <string.h>
size_t maxSeq(int*array, size_t n){
  size_t maxLength = 0;
  size_t counter = 1;
  if(n == 0){
    return maxLength;
  }
  if(n == 1){
    maxLength = 1;
    return maxLength;
  }
  for(int i = 1;i < n;i++){
    if((array[i]-array[i-1])>0){
      counter += 1;
    }else{
      if(maxLength < counter){
        maxLength = counter;
      }
      counter = 1;
    }
  }
  if(maxLength < counter){
    maxLength = counter;
  }
  return maxLength;
}

这是第二段没有通过的代码:

#include <stdio.h>
#include <string.h>
size_t maxSeq(int*array, size_t n){
  int maxLength = 0;
  int counter = 1;
  if( n== 0){
    return maxLength;
  }
  if(n == 1){
    maxLength = 1;
    return maxLength;
  }
  for(size_t i = 1;i < n;i++){
    if((array[i]-array[i-1])>0){
      counter += 1;
      if(counter >= maxLength){
        maxLength = counter;
      }
    }else if((array[i]-array[i-1])<=0){
      counter = 1;
    }
  }
  return maxLength;
}

【问题讨论】:

  • 你的意思是你想确定长度数组元素的最大(严格)递增序列。序列本身不能用单个数字来表征。在这种情况下,我不明白为什么 {3,5,0,7,8,9} 的预期结果会是 3。子序列 {0,7,8,9} 严格递增并且长度为 4。
  • 对不起,最大递增序列的长度应该是4。

标签: c arrays algorithm


【解决方案1】:

这两个代码基本上是等效的,对于示例输入,两者都给了我正确的答案(4,而不是 3)。

ncountermaxLengthi 之间的类型差异会产生不好的代码气味,实际​​上它们可能会导致 两个 代码在长度为不能用类型 int 表示。然而,考虑到第一个代码通过了,这不太可能是测试人员所执行的问题。

第二个代码的主要问题是它对非递增的输入数组产生了错误的结果 (0),因此最大严格递增的子序列的长度为 1。出现这种情况的原因保留为练习。如果您仅通过阅读代码就无法弄清楚,那么请考虑使用调试器来详细跟踪执行。

【讨论】:

  • 感谢您的回复。您对如何避免由类型差异引起的问题有什么建议吗?我们始终保持相同类型的相关变量是否明智?
  • @FëanorTang,您应该确保在任何地方都选择适合您放置它们的目的的数据类型。这包括能够表示您需要适应的范围的极端值。我不会直截了当地说应该总是匹配变量类型,但通常你应该这样做。如果不这样做,您应该能够解释为什么可以这样做,并且作为一种风格问题,您应该强烈考虑将该解释放在代码注释中。
  • 感谢您的清晰解释。真的很有帮助。
猜你喜欢
  • 1970-01-01
  • 2016-06-28
  • 1970-01-01
  • 1970-01-01
  • 2012-01-02
  • 2014-05-23
  • 1970-01-01
  • 2013-11-27
  • 1970-01-01
相关资源
最近更新 更多