題目描述
輸入10個整數,將其中最小的數與第一個數對換,把最大的數與最後一個數對換。寫三個函數; ①輸入10個數;②進行處理;③輸出10個數。
輸入
10個整數
輸出
整理後的十個數,每個數後跟一個空格(注意最後一個數後也有空格)
樣例輸入
2 1 3 4 5 6 7 8 10 9
樣例輸出
1 2 3 4 5 6 7 8 9 10
解答:(題目本身很簡單,但是值得總結)
#include <cstdio>
#include <algorithm>
using namespace std;
int main()
{
int ans[10];
int siteMax,siteMin,myMax = INT_MIN,myMin = INT_MAX;
for(int i = 0;i < 10;i++){
int temp;
scanf("%d",&temp);
if(myMax < temp){
myMax = temp;
siteMax = i;
}
if(myMin > temp){
myMin = temp;
siteMin = i;
}
ans[i] = temp;
}
swap(ans[0],ans[siteMin]);
if(siteMax == 0) siteMax = siteMin; //error
swap(ans[9],ans[siteMax]);
for(int i = 0;i < 10;i++)
printf("%d ",ans[i]);
printf("\n");
return 0;
}
總結:
註釋的地方是我的錯誤點,原因是我沒有考慮到 ans[0] 可能就是最大值。
這種容易犯錯的陷阱如何避免呢?積累經驗當然是有效的,但是若遇到陌生的陷阱又當如何呢?因爲我們不可能爲了正確就每一步都排查,這樣會耗費很多時間。所以我想到了一個想法,就是在自己水平不高時先不要太在意代碼的簡潔性。正如這道題,正常最直觀的思路是找到最大值的位置與第一個元素交換,再找到最小值的位置與最後一個元素交換。
上述這種最直觀的想法因爲是契合我們人平時思考的(我們腦海中解決辦法一般都是先想着解決,其次纔是效率),也就是說按最開始的方法應該是對於自身來說把握最大的。並且算法的時間複雜度是以最深層判斷的,所以很多時候用我們最原始的想法也不會多耗費太多時間。
所以,我的結論就是,先以最直觀、最有把握的寫法寫,若想改寫成更簡潔再考慮改寫之後與改寫之前有什麼不同。