巧妙的移位算法

编程珠玑的第二章的移动 :

B、将一个N元一维向量向左旋转i个位置。例如:当n=8且i=3时,向量abcdefgh旋转为defghabc。 简单的代码使用一个n元的中间向量在n步内完成该工作。你能否仅使用数个额外字节的存储空间,在正比于n的时间内完成向量的旋转?

移动x[0]到临时变量t,然后移动x[i]到x[0],x[2i]到x[i]依些类推。


public static char[] getCharByTrick(char x[], int rotdist) {

char t;
                   int j, k;
int n = x.length;

for (int i = 0; i < gcd(rotdist, n); i++) {
t = x[i];
j = i;

while (true) {
k = j + rotdist;
if (k >= n) {
k -= n;
}

if (k == i) {
break;
}
x[j] = x[k];
j = k;
}
x[j] = t;
}

return x;
}

// 最大公约数
public static int gcd(int rotdist, int n) {

for (int j = n; j > 0; j--) {
if (n % j == 0 && rotdist % j == 0) {
return j;
}
}
return 0;
}

你可能感兴趣的:(算法)