一.左旋
解1
void left_move(char* msg, int len, int steps)
{
assert(msg);
assert(len);
steps = steps%len;
int i = 0;
while (steps--)
{
char temp = msg[0];
for (i = 1; i < len; ++i)
{
msg[i - 1] = msg[i];
}
msg[i - 1] = temp;
}
}
int main()
{
char msg[] = "abcdefghi";
int steps = 4;
left_move(msg, strlen(msg), steps);
printf("%s\n", msg);
system("pause");
return 0;
}
解2
void reverse_string(char* left, char* right)
{
assert(left);
assert(right);
while (left < right)
{
*left = *left^*right;
*right = *left^*right;
*left = *left^*right;
++left;
--right;
}
}
void left_move(char* msg, int len, int steps)
{
assert(msg);
assert(len);
steps = steps%len;
reverse_string(msg, msg + steps - 1);
reverse_string(msg + steps, msg + len - 1);
reverse_string(msg, msg + len - 1);
}
int main()
{
char msg[] = "abcdefghi";
int steps = 4;
left_move(msg, strlen(msg), steps);
printf("%s\n", msg);
system("pause");
return 0;
}
二.右旋
解1
void right_move(char* msg, int len, int steps)
{
assert(msg);
assert(len);
steps = steps%len;
int i = 0;
while (steps--)
{
char temp = msg[len-1];
for (i = len-1; i >0; --i)
{
msg[i] = msg[i - 1];
}
msg[0] = temp;
}
}
int main()
{
char msg[] = "abcdefghi";
int steps = 4;
right_move(msg, strlen(msg), steps);
printf("%s\n", msg);
system("pause");
return 0;
}
解2
void reverse_string(char* left, char* right)
{
assert(left);
assert(right);
while (left < right)
{
*left = *left^*right;
*right = *left^*right;
*left = *left^*right;
++left;
--right;
}
}
void right_move(char* msg, int len, int steps)
{
assert(msg);
assert(len);
steps = steps%len;
reverse_string(msg, msg + len - 1 - steps);
reverse_string(msg + len - steps, msg + len - 1);
reverse_string(msg, msg + len - 1);
}
int main()
{
char msg[] = "abcdefghi";
int steps = 4;
right_move(msg, strlen(msg), steps);
printf("%s\n", msg);
system("pause");
return 0;
}