左旋字串的三種方法
阿新 • • 發佈:2019-02-09
實現字串的左旋:
注:有效次數為:總次數% 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);
}