当前位置:编程学习 > C/C++ >>

c++将字符串循环左移n个位置

C代码 
#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 gcd(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 = gcd(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++ ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,