问题分析:
这个题目需要对输入的整数序列进行处理,获取最大值和最小值,然后将它们与序列的第一个数和最后一个数交换位置,最终输出交换后的序列。
在你的代码中,有一些问题需要解决:
1. max=arr[i]>=arr[i+1]?i:i+1; 这行代码会导致数组越界,当 i=n-1 时,arr[i+1] 就越界了。所以需要在循环中让 i<n-1。
2. min=arr[i]<=arr[i+1]?i:i+1; 同样也会导致数组越界,同样需要在循环中让 i<n-1。
3. cout<<arr[i]<<" "; 必须要等到全部交换完成后再输出序列,否则会输出不正确的序列。
4. 没有交换第一个数和最小值。需要在第一次循环结束后再进行交换。
5. 没有交换最后一个数和最大值。需要在第二次循环结束后再进行交换。
6. 需要在循环结束后输出交换后的序列。
解决方案:
下面是修改后的代码,已经添加了注释说明修改的地方。++#include <iostream>using namespace std;int main(){ int n; cin >> n; int arr[n], max, min, temp; for (int i = 0; i < n; i++) { cin >> arr[i]; } // 循环中让i<n-1,防止数组越界 for (int i = 0; i < n - 1; i++) { max = arr[i] >= arr[i + 1] ? i : i + 1; min = arr[i] <= arr[i + 1] ? i : i + 1; temp = arr[max]; arr[max] = arr[min]; arr[min] = temp; // 每次交换不要输出序列 } // 交换第一个数和最小值 temp = arr[0]; arr[0] = arr[min]; arr[min] = temp; // 循环中让i<n-1,防止数组越界 for (int i = 0; i < n - 1; i++) { max = arr[i] >= arr[i + 1] ? i : i + 1; min = arr[i] <= arr[i + 1] ? i : i + 1; temp = arr[max]; arr[max] = arr[min]; arr[min] = temp; // 每次交换不要输出序列 } // 交换最后一个数和最大值 temp = arr[n - 1]; arr[n - 1] = arr[max]; arr[max] = temp; // 输出交换后的序列 for (int i = 0; i < n; i++) { cout << arr[i] << " "; } return 0;}
希望这个解释对你有所帮助!如果还有其他问题,请随时提问。
球一个最佳答案谢谢啦!这对我非常重要!   |