for(i=1; i<=m; i++){
a=z[n];
for(p=&z[n]; p>=&z[2]; p--)
p=(p-1);
z[1]=a;
}
++++++++++++++++++++++++++++++++++++++++
作用:將數組z[n]中的所有元素進行向右移m位, 多出來的左端補上。
例如: 12345 m=1 變成 51234
但是我的算法效率太低, 當數組很長, m很大時超時,
求大神指點
數組 12345 數組的長度大小 5 ,我們來看看m變化時數組元素的順序
m的值 數組元素的順序
0 12345
1 51234
2 45123
3 34512
4 23451
5 12345
6 51234 m=6 和 m=6%5 順序一樣,
7 45123 m=7 和 m=7%5 。。。。,
8 34512 m=8 和 m=8%5 。。。。,
9 23451 m=9 和 m=9%5 。。。。,
10 12345 m=10和 m=10%5=0(整除了,且是偶數倍) 和誰一樣??? 就是他自己
11 51234 m=11和 m=11%5=1 。。。。。,
.......
n m=n 和 m=n%5 一樣一樣的,
看出什麼了嗎? 相信你有點感覺了。
m變化時,最好的情況: m=0 或者m是數組長度大小的偶數倍 數組的數組順序是不變的。O(0)
最壞的情況: m是數組長度大小的奇數倍 直接將數組逆序就ok O(n)
綜合下 (n/2)
ok剩下的不用我多說了,兄弟你可以搞定。這只是我的一點優化想法,移動之前先算一下,就ok