w13 12/09/2020 實驗課上機總結
阿新 • • 發佈:2020-12-10
題目描述
鍵盤輸入n,m,n為整數個數,m為每一個數的後移位數,要求後面的數迴繞到前面
核心程式碼
//方法一:陣列作臨時交換變數
int b[N] = { 0 }, *p, *q;
p = a;
q = b;
for (; q - b < n; p++, q++) {
while (p - m - a < 0)//本質與核心:平移後的下標
p += n;
while (p - m - a > n-1)
p -= n;
//方法二:簡單變數作臨時交換變數
int t, * p;
p = a;
while (p + n - 2 - a -(m%n-1)>= 0) {//不斷與前一位做交換
t = *(p + n - 1);
*(p + n - 1) = *(p + n - 2);
*(p + n - 2)=t ;
p--;
}
方法二當時沒做出來…現在是中午12:30,下課時間是9:35
總結出來的現象是:
迴繞條件下,每一個數組元素向後移動一位,最後一個元素開始不斷與前一個交換,直到最後一個元素被交換到第一位為止。
後移m位,也就是將這個過程做m次。
為什麼是m%n呢?想一想%的特點:迴圈、週期、範圍。
其實不用m%n只用m也可,只是多做了幾次while迴圈,但想一想,如果m=2^31-1,多做的迴圈就不止幾次了。 發掘其中的數學規律可以有效減少時空成本。
總結
1.基本上能做到不受外界干擾沉浸式做題,但最後幾分鐘仍然沒能堅持下來提前走了,需要反思。
2.草稿本很重要,班群裡面的反映也是如此。
3.從最基本最簡單的特例入手,尋找規律是必然,不要試圖從抽象符號一步到位,無數的嘗試證明這是徒然的,除非日常有足夠的刻意練習。這與第二點相輔相成。
4.測試的時候忽略了極端資料,即移動的時候只測試了1、2位,未測試2^31-1這種龐大的數字,導致提交的時候該用while的卻用了if,這屬於忽視了另一種特殊情形。
5.班群裡面DL很多,但不要一味焦慮,應當潛心學習。
6.平時發呆胡思亂想的時間太多了,潛意識刻意練習不夠到位。 7.另,今天開始學習使用markdown,感覺很有趣(๑•̀ㅂ•́)و✧(突然活潑)