我的解決方案使用了O旋轉串代替(1)存儲:
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
void rotleftmem(void *p, size_t len, size_t lshift)
{
unsigned char *d;
size_t start;
size_t dx, sx;
size_t todo;
unsigned char x;
if (!len)
return;
lshift %= len;
if (!lshift)
return;
d = p;
todo = len;
for (start = 0; todo; start++) {
x = d[start];
dx = start;
while (1) {
todo--;
sx = dx + lshift;
if (sx >= len || sx < dx /*overflow*/)
sx -= len;
if (sx == start) {
d[dx] = x;
break;
}
d[dx] = d[sx];
dx = sx;
}
}
}
void *rotatemem(void *p, size_t len, ssize_t rshift)
{
if (len) {
size_t lshift = rshift < 0 ? -rshift : len - rshift % len;
rotleftmem(p, len, lshift);
}
return p;
}
char *rotatestr(char *s, ssize_t rshift)
{
return rotatemem(s, strlen(s), rshift);
}
int main(int argc, char *argv[])
{
ssize_t rshift;
char *s;
if (argc != 3) {
fprintf(stderr,
"usage: %s N STR\n"
"Rotate STR right by N or left by -N\n",
argv[0]);
return 2;
}
rshift = strtol(argv[1], NULL, 10);
s = argv[2];
printf("%s\n", rotatestr(s, rshift));
return 0;
}
代碼的膽是在功能rotleftmem
,其旋轉的存儲器塊指定的長度留下一個指定的,無符號的「左移」值。 rotatemem
是圍繞rotleftmem
圍繞任一方向旋轉的包裝;負移位值向左旋轉,正移位值向右旋轉;帶符號的移位值被轉換爲正的「左移」值。 rotatestr
是一個圍繞rotatemem
的包裝,它接受一個指向空終止字符串的指針,而不是指向void加長度的指針。 rotatestr
和rotatemem
都返回原始指針。
對於rotleftmem
,如果塊長度(len
)是非零的,「左移位」的值(lshift
)降低模len
。如果len
或(減少的)lshift
值中的任一值爲0,則該函數不執行任何操作。否則,外環將迭代GCD(len, lshift)
次(其中GCD(a, b)
是a
和b
最大公約數)。對於外部循環的每次迭代,內部循環將迭代len/GCD(len, lshift)
次,因此內部循環的迭代總數爲len
。時間複雜度是O(n),其中n是塊的長度。
「不起作用」不是一個明確的問題陳述。你能否用更具體的問題陳述來編輯你的問題? –
'buff [n] ='\ 0''中的n是什麼?它與什麼有關? – AnT
修復您的功能簽名。這不是標準。 –