c++将字符串循环左移n个位置
#include <stdio.h>#include <stdlib.h>
#include <string.h>
/*********************** 最节约时间的方法 ************************/
/**
* @brief 将字符串向左旋转n个位置
* @param str 待旋转的字符串
* @param[in] mov 需要旋转的数量
* @return 无
*/
void move_string_left(char *str, int mov)
{
if (NULL == str || mov <= 0)
return;
char tmp[mov];
int i;
int len = strlen(str);
if (len == 0)
return;
mov %= len;
printf("move %d times ", mov);
if (mov == 0)
return;
for (i = 0; i < sizeof tmp; i++)
tmp[i] = str[i];
tmp[i] = ;
for (i = 0; i < len-mov; i++)
str[i] = str[i+mov];
for (; i < len; i++)
str[i] = tmp[i-(len-mov)];
}
/**
* @brief 将字符串向右旋转n个位置
* @param str 待旋转的字符串
* @param[in] mov 需要旋转的数量
* @return 无
*/
void move_string_right(char *str, int mov)
{
if (NULL == str || mov <= 0)
return;
char tmp[mov];
int i;
int len = strlen(str);
if (len == 0)
return;
mov %= len;
printf("move %d times ", mov);
if (mov == 0)
return;
for (i = len - mov; i < len; i++) {
tmp[i-(len-mov)] = str[i];
}
tmp[i-(len-mov)] = ;
for (i = len - 1; i >= mov; i--) {
str[i] = str[i-mov];
printf("str[%d] = str[%d] = %c ", i, i-mov, str[i-mov]);
}
for (; i >= 0; i--)
str[i] = tmp[i];
}
/*********************** 最节约时间的方法 ************************/
/*********************** 最节约空间的方法 ************************/
/**
* @brief 将字符串向左旋转1个位置
* @param str 待旋转的字符串
* @param[in] mov 需要旋转的数量
* @return 无
*/
void move_string_one_left(char *str)
{
if (NULL == str)
return;
int len = strlen(str);
int i;
if (len == 0)
return;
char tmp = str[0];
for (i=0; i<len-1; i++) {
str[i] = str[i+1];
}
str[i] = tmp;
}
/**
* @brief 将字符串向右旋转1个位置
* @param str 待旋转的字符串
* @param[in] mov 需要旋转的数量
* @return 无
*/
void move_string_one_right(char *str)
{
if (NULL == str)
return;
int len = strlen(str);
if (len == 0)
return;
char tmp = str[len-1];
int i;
for (i=len-1; i>0; i--) {
str[i] = str[i-1];
}
str[i] = tmp;
}
/*********************** 最节约空间的方法 ************************/
/*********************** 最节约空间和时间的方法 ************************/
/**
* @brief 返回数值i和j的最大公约数
* @return 正确返回最大公约数,参数有问题返回-1
*/
int 易做图(int i, int j)
{
if (i<=0 || j<=0)
return -1;
while (i != j) {
if (i > j)
i -= j;
else
j -= i;
}
return i;
}
/**
* @brief 将字符串向左旋转n个位置
* @param str 待旋转的字符串
* @param[in] mov 需要旋转的数量
* @return 无
*/
void move_string_fast_left(char *str, int mov)
{
if (NULL == str || mov <= 0)
return;
int len = strlen(str);
char tmp;
if (!mov)
return;
mov %= len;
if (!mov)
return;
int i, j, k;
int g_cd = 易做图(mov, len);
for (i=0; i<g_cd; i++) {
tmp = str[i];
j = i;
while (1) {
k = j + mov;
if (k >= len)
k -= len;
补充:软件开发 , C++ ,