這一次的題目有著最高的通過率,但是卻是我花時間最久的一道題。。。首先我的方向走錯了,最開始我想到了以前遇到的一種用少的變數交換陣列的題目,但是這兩個完全是不同的解題思路,這裡我就花費了很長時間才走回正常的思路,然後是我自己想岔了一種情形,我把一種在特殊的情形下適用的規律當作了普遍規律,這也導致了我再次犯錯,然後我通過不斷地一步步地除錯找出了問題出在了**,找到問題後,我又想不到該怎麼解決這一問題,這使得我這道題花費了非常長的時間,可能比前兩道題加起來還要多。我的經驗教訓就是:
1.學會一步步地除錯,列印輸出觀察
2.不要盲目地模擬思路,一定要讀懂題目,先嘗試用最簡單的方法去實現這個問題
3.一定要想明白總結的規律是否具有普遍性,實在不行多舉幾個例子試試
4.一定要想明白自己當前遇到的問題是什麼,將大的問題拆分成乙個個小的問題,保持自己的思路清晰。遇見暫時無從下手的問題,不如發散思維,多想想各種各樣的思路。
#include
using namespace std;
int compute_dst(int i, int n, int m);
int main()
int n = 0, m = 0;
cin >> n >> m;
m = m % n;
int *a = new int[n];
for (int i_a = 0; i_a < n; i_a++)
cin >> a[i_a];
int v = a[0];
int j = v;
int i = 0;
int cnt = 0;
int initial_i = 0;
int dst = compute_dst(i, n, m);
doj = a[dst];
a[dst] = v;
i = dst;
v = j;
dst = compute_dst(i, n, m);
if (initial_i == i)
i++;
initial_i = i;
dst = compute_dst(i, n, m);
v = a[i];
for (int i_a = 0; i_a < n; i_a++)
cout << a[i_a] << ' ';
cout << "\n";
cnt++;
while (cnt != n);
for (int i_a = 0; i_a < n-1; i_a++)
cout << a[i_a] << ' ';
cout << a[n - 1];
delete a;
return 0;
int compute_dst(int i, int n, int m)
int dst;
if (i >= (n - m))
dst = i - n + m;
else
dst = i + m;
return dst;
自測3 陣列元素迴圈右移問題
乙個陣列a中存有n n 0 個整數,在不允許使用另外陣列的前提下,將每個整數迴圈向右移m m 0 個位置,即將a中的資料由 a0 a1 an 1 變換為 an m an 1 a0 a1 an m 1 最後m個數迴圈移至最前面的m個位置 如果需要考慮程式移動資料的次數盡量少,要如何設計移動的方法?輸入...
自測 3 陣列元素迴圈右移問題
乙個陣列 a中存有n 0 個整數,在不允許使用另外陣列的前提下,將每個整數迴圈向右移m 0 個位置,即將 a中的資料由 a 0 a 1 a n 1 變換為 a n m a n 1 a 0 a 1 a n m 1 最後 m個數迴圈移至最前面的 m個位置 如果需要考慮程式移動資料的次數盡量少,要如何設計...
自測 3 陣列元素迴圈右移問題
乙個陣列a中存有n 0 個整數,在不允許使用另外陣列的前提下,將每個整數迴圈向右移m 0 個位置,即將a中的資料由 a 0 a 1 a n 1 變換為 a n m a n 1 a 0 a 1 a n m 1 最後m個數迴圈移至最前面的m個位置 如果需要考慮程式移動資料的次數盡量少,要如何設計移動的方...