【问题标题】:what's wrong with this "maximum-minimum element in an array" Logic?这个“数组中的最大最小元素”逻辑有什么问题?
【发布时间】:2021-11-03 11:23:40
【问题描述】:

我是编码新手,我看不出这个逻辑有什么问题。 我无法获得该程序所需的输出。 问题是找到数组的最小和最大元素。

这个想法是分别为最小值和最大值创建两个函数,并进行线性搜索以识别最大值和最小值。

#include <iostream>
#include<climits>
using namespace std;
void maxElement(int a[], int b)
{
    // int temp;
    int maxNum = INT_MIN;
    for (int i = 0; i < b; i++)
    {
        if (a[i] > a[i + 1])
        {
             maxNum = max(maxNum, a[i]);
        }
        else
        {
             maxNum = max(maxNum, a[i+1]);
        }
        // maxNum = max(maxNum, temp);
    }
    // return maxNum;
    cout<<maxNum<<endl;

    
}
void minElement(int c[], int d)
{
    // int temp;
    int minNum = INT_MAX;
    for (int i = 0; i < d; i++)
    {
        if (c[i] > c[i + 1])
        {
            minNum = min(minNum,c[i+1]);
        }
        else 
        {
            minNum = min(minNum,c[i]);
        }
        // minNum = min(minNum, temp);
    }
    // return minNum;
    cout<<minNum<<endl;
}
int main()
{
    int n;
    cin >> n;
    int arr[n];
    for (int i = 0; i < n; i++)
    {
        cin >> arr[i];
    }
   
   minElement(arr,n);
   maxElement(arr,n);

   

    return 0;
}

【问题讨论】:

  • 您为什么在一次迭代中考虑a[i]a[i+1]i+1 不是上次迭代中的有效索引
  • int arr[n]; 也不是标准的 C++。 Why aren't variable-length arrays part of the C++ standard?
  • 您只比较相邻的数字,然后再决定一个数字是新的最小值还是最大值。您需要将新数字与现有的最小值或最大值进行比较,而不是与其相邻的数字进行比较。

标签: c++ dsa


【解决方案1】:

您已经在将每个元素与当前的 max / min 进行比较。目前尚不清楚为什么还要与相邻元素进行比较。尝试在最后一次迭代中访问 a[i+1] 会超出数组的范围并导致未定义的行为。只需删除该部分:

void maxElement(int a[], int b)
{
    // int temp;
    int maxNum = INT_MIN;
    for (int i = 0; i < b; i++)
    {
             maxNum = max(maxNum, a[i]);
    }
    cout<<maxNum<<endl;
}

其他方法类似。

注意

int n;
cin >> n;
int arr[n];

不是标准的 C++。一些编译器支持可变长度数组作为扩展,但您不需要它们。您应该使用std::vector,如果您想使用 c-arrays 进行练习,请动态分配数组:

int n;
cin >> n;
int* arr = new int[n];

还可以考虑查看std::minmax_element,这是您要查找容器的最小和最大元素时使用的标准算法。

最后但同样重要的是,您应该将计算与屏幕上的输出分开。考虑到这一切,您的代码可能如下所示:

#include <iostream>
#include <algorithm>

std::pair<int,int> minmaxElement(const std::vector<int>& v) {
    auto iterators = std::minmax_element(v.begin(),v.end());
    return {*iterators.first,*iterators.second};
}
int main()
{
    int n;
    std::cin >> n;
    std::vector<int> input(n);
    for (int i = 0; i < n; i++)
    {
        std::cin >> input[i];
    }
   
    auto minmax = minmaxElement(input);
    std::cout << minmax.first << " " << minmax.second;
}

该方法仅包装标准算法。它不是真的需要,但我试图保留你的一些代码结构。 std::minmax_element 返回需要取消引用以获取元素的迭代器的 std::pair。该方法假定input 至少有一个元素,否则解引用迭代器无效。

【讨论】:

    猜你喜欢
    • 2020-07-08
    • 2020-08-09
    • 2012-10-17
    • 2021-09-01
    • 2011-08-13
    • 1970-01-01
    • 2019-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多