我将如何编写算法来找到序列中从数字到数字的最大跳跃?

Posted

技术标签:

【中文标题】我将如何编写算法来找到序列中从数字到数字的最大跳跃?【英文标题】:How would I write an algorithm to find the greatest jump from number to number in a sequence? 【发布时间】:2020-02-18 17:04:38 【问题描述】:

如果你的序列是4 2 1,最大的跳跃是从4到2。如果你的序列是3 10 5 16 8 4 2 1,最大的跳跃是从5到16。

我已经制作了一个算法,但是我不完全确定我做错了什么(无论我没有正确地制作循环,正确地设置我的变量,或者其他什么)。我也不确定设置索引、BiggestDiff 或 CurrentDiff 需要什么。我尝试使用 while 循环来比较向量中的每个数字,但我得到零(我假设是因为我将 BiggestDiff 设置为零)

如果有人能指出我正确的方向,请给我一个示例或其他内容,我们将不胜感激。

下面是我的代码

int findBiggestDiff(std::vector<int> sequence)

  int index = 0;
  int BiggestDiff = 0 ;
  int CurrentDiff = BiggestDiff;
  CurrentDiff = std::abs(sequence[index] - sequence[index + 1]);
  while (index < sequence.size())
  
    if (CurrentDiff > BiggestDiff)
    
      BiggestDiff = CurrentDiff;
    

    return index;
  

【问题讨论】:

在你的 while 循环中,你不是在计算 CurrentDiff ......你在里面做一个 return ...... 您还需要记住给您带来最大差异的两个数字。 如果对您有帮助,请考虑接受答案。 【参考方案1】:

试试这个:


    int indexOfBiggestJump = 0;
    int BiggestDiff = 0 ;
    int CurrentDiff = BiggestDiff;

    for(int i = 0; i < sequence.size() - 1; i++) 
        CurrentDiff = std::abs(sequence[i] - sequence[i + 1]);
        if (CurrentDiff > BiggestDiff)
        
            BiggestDiff = CurrentDiff;
            indexOfBiggestJump = i;
        
    
    return indexOfBiggestJump;

您的代码中有几个错误。

    你的 return index 真的什么都不做,只返回 index(将是 0)总是。

    你没有保存最大跳跃的索引。

    如果你正在寻找ii + 1的位置,你必须一直到sequence.size() - 1,否则你会超出sequence的范围。

【讨论】:

您应该解释或注释您的代码如何解决 OP 的问题。【参考方案2】:

您根本没有重新计算CurrentDiff。此外,您的 return 声明在错误的位置。你可以做这样的事情(未测试)

int findLargest( const std::vector<int> &sequence ) 
  if ( sequence.size() < 2 ) return -1; // if there's not at least two elements, there's nothing valid.
  int index = 0;
  int biggestIndex = -1;
  int biggestDiff = -1;

  while (index < sequence.size() - 1) // -1 so that the +1 below doesn't go out of range
  
    // get the current difference
    int currentDiff = std::abs(sequence[index] - sequence[index + 1]);
    if (currentDiff > biggestDiff)
    
       // update stats
       biggestIndex = index;
       biggestDiff = currentDiff;
    
    ++index;
  
  return biggestIndex


int main() 
   //…
   int index = findLargest( sequence );
   if ( index != -1 ) 
       std::cout << "Biggest difference was between " << sequence[index] << " and " << sequence[index+1];
   

【讨论】:

以上是关于我将如何编写算法来找到序列中从数字到数字的最大跳跃?的主要内容,如果未能解决你的问题,请参考以下文章

最大化序列中数字之间的差异

如何在文件处理中从文本文件中找到每一行的最小值和最大值?

如果数字为负,为啥在递归解决方案中找到给定序列中的最大子序列的基本情况返回 0?

[加减号查找数字序列

初识算法

将输入的数字进行按大小排序,并且将输入的数字中从1到最大的数字中缺少的数字