1. 程式人生 > >左旋字串的三種方法

左旋字串的三種方法

實現字串的左旋:

這裡寫圖片描述
注:有效次數為:總次數% N(如上圖所示,假設對字串左旋6次和左旋2次,得到的結果是一樣的)

字串左旋之—— 移首補尾法

這裡寫圖片描述

思路:

  • 左旋一次的方法: 將第一個字元存放起來,然後將第二個至最後一個字元依次向前挪一位,再將第一個字元放在末尾。
  • 先寫一個左旋一次的函式,然後需要左旋幾次,就呼叫幾次這個函式。

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>

#pragma warning(disable:4996)//遮蔽scanf出現的錯誤
char a[] = "abcd1234";//變數定義成全域性較好 int len = strlen(a); //移首補尾法: void left_rotate_one(char* a, int len) { int tmp = a[0]; int i = 0; while (i < len - 1) { a[i] = a[i + 1]; i++; } a[i] = tmp; } void left_rotate(char *a,int len,int count) { assert(a && count>0
); count %= len; while (count--) { left_rotate_one(a, len); } } int main() { int count = 0; printf("please enter:\n"); scanf("%d", &count); printf("%s\n", a); left_rotate(a, len, count); printf("%s\n", a); system("pause"); return 0; }

字串左旋之——逆置法

這裡寫圖片描述

思路:

  • 如上圖所示,假設左旋四次,先將字元陣列分成兩個區間。
  • 前四個字元為一個區間,其後的字元佔一個區間,將這兩個區間的字元分別逆置。
  • 然後再對這個字元陣列整體逆置
//逆置法
void Swap(char *x,char *y)
{
    int tmp = *x;
    *x = *y;
    *y=tmp;

}

void reverse( char*left, char*  right)
{

    while (left < right)
    {
        Swap(left, right);
        left++;
        right--;
    }
}
void left_rotate(char a[], int len, int count)
{
    assert(a&& len > 0 && count > 0);
    reverse(a, a + count - 1);
    reverse(a + count, a + len - 1);
    reverse(a, a + len - 1);

}

左旋字串之——雙倍字串

這裡寫圖片描述

思路:

  • 建立一個新陣列,給它開原來字元陣列的2倍的空間
  • 將原來的字元數組裡的內容拷貝進去,再將原來的字串拼接至其尾部,此時原來的字元陣列為空
  • 對這個字元陣列左旋n次,就是從新陣列的a[n]位置讀取,讀取長度為len
// 雙倍字串法
void left_rotate(char a[], int len,int count)
{
    assert(a && len > 0 && count > 0);
    count %= len;
    char *str = (char*)malloc(2*len+1);
    if (!str)
    {
        return;
    }

    strcpy(str, a);
    strcat(str, a);
    strncpy(a, a + count, len);
}