【问题标题】:How do I swap the last and maximum element in the array?如何交换数组中的最后一个元素和最大元素?
【发布时间】:2021-01-15 18:17:37
【问题描述】:

如何交换数组的最大和最后一个元素?

我想写一个程序,请求自然数NN(不超过100),从各种数的NN进一步序列,改变最后一个元素和最大值的位置,保持其他元素不变,并推导出接收到的数组.

示例输入 1:

8
3 6 12 1 7 19 25 4

样本输出 1:

3 6 12 1 7 19 4 25

这是我尝试过的:

#include <iostream>
using namespace std;
int main() 
{
    int i,arr[100],n;
    cin>>n;
    int imin=0;
    for (int i=0; i<n; i++){cin>>arr[i];}

    int max=0;
    for (i=1;i<n;i++) 
    {
        if (arr[i]>arr[max])
            max=i;
        int tmp=arr[max];
        arr[max]=arr[n-1];
        arr[n-1]=tmp;
        for (i=0;i<n;i++)
            cout <<arr[i]<< " ";
        cout << "\n";  
    }  
    return 0;
}

它不会改变最大和最后的位置。我该怎么做?

【问题讨论】:

  • 如果n输入大于100会怎样?
  • 修复缩进应该更容易发现问题。
  • 有人真的不喜欢我们的回答 :-)
  • @TedLyngmo 这并没有使答案没有用,而是妨碍了一个糟糕的问题被删除。否决这些问题的答案是官方不赞成的,但不幸的是相对普遍的做法。

标签: c++


【解决方案1】:
#include <algorithm> // max_element, iter_swap

// ...

    auto me = std::max_element(arr, arr + n); // get an iterator to the largest element
    std::iter_swap(me, arr + n - 1); // swap the value at "me" with the last element

【讨论】:

【解决方案2】:

我建议使用循环来查找最大值的索引,然后在循环之外交换值

int index = 0;
int max_value = arr[0];
int index_of_max_value = 0;
for (index = 1; index < n; ++n)
{
    if (arr[index] > max_value)
    {
        max_value = arr[index];
        index_of_max_value = index;
    }
}
std::swap(arr[index_of_max_value], arr[n-1]);

【讨论】:

  • 很可能是因为人们不喜欢这个问题,觉得不值得回答。
【解决方案3】:

首先,您必须找到最大的元素索引。然后将其与最后一个元素交换。在某些情况下,最后一个元素可能是最大元素,因此数组根本不会改变,或者有多个最大元素,因此您必须决定下一步要交换哪个元素,第一个最大元素或另一个一个与数组的最后一个元素。

#include<iostream>
#include<vector>
using namespace std;
int main()
{
    int n;
    cin >> n;
    vector<int> arr(n + 1);
    for(int i = 0; i < n; i++){
        cin >> arr[i];
    }

    int maxi = 0;
    for(int i = 0; i < n; i++){
        if(arr[i] > arr[maxi])
            maxi = i;
    }
    // swap is a builtin function that interchange two elements
    swap(arr[maxi], arr[n - 1]); 
    for(int i = 0; i < n; i++)
        cout << arr[i] << " ";
    cout << "\n";
    return 0;
}

示例输入:

8
3 6 12 1 7 19 25 4
4
1 2 3 4

样本输出:

3 6 12 1 7 19 4 25
1 2 3 4

【讨论】:

    【解决方案4】:

    要将数组的最后一个元素与数组的最大元素交换,首先需要通过遍历整个数组找到最大元素的索引。然后将数组的最后一个索引与您为最大元素获得的索引交换。你的代码有一些错误,我修复了它们,看看。另请参阅我所做的缩进,这是一种很好的做法,它使代码更加可红色。

    swap(x, y) 是一个用于交换两个变量值的内置函数。

    你可以这样做:

    #include <iostream>
    using namespace std;
    int main() 
    {
        int n;
    
        cin>>n;
        
        //int arr[n]; 
        // as said in the comment it's not the standard way to declare variable length array in C++, either use fixed length or use vector in c++
    
        vector<int> arr(n + 1);
    
        for (int i = 0; i < n; i++) cin >> arr[i];
    
        int mx = 0, idx;
    
        for(int i = 0; i < n; i++){
            if(arr[i] > mx){
                mx = arr[i];
                idx = i;
            }
        }
    
        swap(arr[n-1], arr[idx]); // swap is a builtin function
       
        for(int i = 0; i < n; i++)
             cout << arr[i] << " ";
        cout << "\n";  
     }  
    return 0;}
    

    【讨论】:

    • @SahadatHossain 从严格的语言角度来看,C++ 标准未定义它这一事实使其行为未定义。它工作是UB的一种可能结果。但它完全编译的事实意味着你的编译器支持它作为语言的非标准扩展,所以如果你的编译器供应商记录它是如何工作的,它就不会是未定义的行为。
    • 这个答案不正确,VLA 不是合法的 C++。如果您依靠编译器扩展来使此代码编译和工作,请在答案中明确非常
    • 我现在知道了,学到了一些新东西,我用了很长时间,但不知道这不是标准的方式。
    • 感谢您更新答案,现在好多了。
    【解决方案5】:
    #include <iostream>
    using namespace std;
    int main() 
        {
        int i,arr[100],n;
        cin>>n;
        int imin=0;
        for (int i=0; i<n; i++){cin>>arr[i];}
    
        int max=0;
        for (i=1;i<n;i++) 
        {
            if (arr[i]>arr[max])
                max=i;
        } // closed the for loop here//
    
        int tmp=arr[max];
        arr[max]=arr[n-1];
        arr[n-1]=tmp;
        for (i=0;i<n;i++)
             cout <<arr[i]<< " ";
         cout << "\n";  
     
         return 0;
        }
    

    您的代码很好,只需要在 max=i 语句之后关闭 for 循环。 如果您有任何其他问题,请询问。

    【讨论】:

    • 将 cmets 添加到您的代码中是一个好主意,可以让访问者了解您所做/编辑的内容。
    • @RohanBari 谢谢你,先生,我是这个平台的新手,像你这样的人肯定会指导我。
    • 在循环中添加大括号不会改变这里的输出。这是因为如果您在循环中只有一个语句,它们将变得完全可选,这就是当前正在发生的事情。
    • @Rohan Bari 你最初没有让我明白 for 循环最后关闭了,现在我提前关闭了它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-14
    • 1970-01-01
    • 2021-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-31
    相关资源
    最近更新 更多