Codeup_1863_數字交換

題目描述

輸入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] 可能就是最大值。

這種容易犯錯的陷阱如何避免呢?積累經驗當然是有效的,但是若遇到陌生的陷阱又當如何呢?因爲我們不可能爲了正確就每一步都排查,這樣會耗費很多時間。所以我想到了一個想法,就是在自己水平不高時先不要太在意代碼的簡潔性。正如這道題,正常最直觀的思路是找到最大值的位置與第一個元素交換,再找到最小值的位置與最後一個元素交換。

上述這種最直觀的想法因爲是契合我們人平時思考的(我們腦海中解決辦法一般都是先想着解決,其次纔是效率),也就是說按最開始的方法應該是對於自身來說把握最大的。並且算法的時間複雜度是以最深層判斷的,所以很多時候用我們最原始的想法也不會多耗費太多時間。

所以,我的結論就是,先以最直觀、最有把握的寫法寫,若想改寫成更簡潔再考慮改寫之後與改寫之前有什麼不同。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章