實現一個函數,可以左旋字符串中的k個字符.ABCD左旋一個字符得到BCDA ABCD左旋兩個字符得到CDAB

#include<stdio.h>
#include<windows.h>
#include<string.h>
#include <stdlib.h> 
#include<assert.h>
  1. 方法一
    分析:原字符串ABCD1234,若要旋轉4位,則將字符串分爲兩部分
    先將字符串ABCD逆序得:DCBA;
    然後將1234逆序得:4321;
    得到現在字符串:DCBA4321,再逆序得1234ABCD,即原字符串的左旋k位。
void Reverse(char* left, char* right)//字符串逆序
{
    assert(left);
    assert(right);
    while (left < right)
    {

        *left ^= *right;//用異或來逆序
        *right ^= *left;
        *left ^= *right;
        left++;
        right--;
    }

}
void LevoStrOne(char *str, int len , int k)
{
    assert(str);
    if (str != NULL && len > 0)
    {
        k = k%len;//當k大於len時,取餘避免多次旋轉浪費時間,k小於len時取餘依然是原值不影響結果
        Reverse(str + 0, str + k - 1);//字符串分爲兩部分,先逆序k位
        Reverse(str + k, str + len - 1);//逆序k後的字符串
        Reverse(str + 0, str + len - 1);//逆序整個字符串
    }
    else
    {
        return;
    }
}
  1. 方法二
    分析:開闢一個新的字符串空間s,先將ABCD1234複製過去,然後再將ABCD1234拼接在s後面得到ABCD1234ABCD1234,要移動k位,在s字符串中從第k位開始取原字符串長度複製到原字符串str中,這個操作可以用strncpy完成。
void LevoStrTwo(char str[], int len, int k)
{

        k %= len;
        char *s = (char *)malloc((2 * len + 1)*sizeof(char));//開闢所需字符串空間
        if (s == NULL)
        {
            printf("mallic error\n");
        }
        strcpy(s,str);//拷貝字符串
        strcat(s,str);//拼接字符串
        strncpy(str, s + k, len);
        free(s);
}
  1. 方法三
    分析:先將A字符給temp保存,ABCD1234中從B字符開始向左拷貝得到BBCD1234,然後依次拷貝得到BCD12344,再將temp給字符串最後一位得到BCD1234A。
void LevoStrThree(char *str,int len,int k)
{
    k %= len;
    int i = 0;
    for (i=0; i < k; i++)//循環k次
    {
        int j = 0;
        char temp = str[j];
        for (j=0; j < len - 1; j++)//從第二個字符開始,字符依次向左覆蓋一位
        {
            str[j] = str[j + 1];
        }
        str[j] = temp;//將第一個字符放在字符串最後位置
    }

}
void test()
{
    char str[] = "ABCD1234";
    char *ret = NULL;
    int len = strlen(str);
    printf("原字符串:%s\n",str);
    LevoStrThree(str, len, 4);
    printf("左旋後的字符串:%s\n", str);

}

int main()
{
    test();
    system("pause");
    return 0;
}
發佈了57 篇原創文章 · 獲贊 12 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章