字串移位演算法總結
阿新 • • 發佈:2021-01-10
字串移位演算法總結
題目如下:
把字串前面的若干個字元轉移到字串的尾部。請定義一個函式實現字串左旋轉操作的功能。比如,輸入字串"abcdefg"和數字2,該函式將返回左旋轉兩位得到的結果"cdefgab"。
詳情請見力扣: 左旋轉字串
以下的程式碼均以在力扣AC
暴力遍歷法
這種應該是最容易想到的方法了,要將前n位字元移位就整體向前移位n次,每次整體移位的時候都將此時的首字元移到字元尾。
(n^2去世)
char* reverseLeftWords (char* s, int n){
/*暴力遍歷法*/
int len = strlen(s);
for(int i = 0;i<n;i++)
{
int temp = s[0];
for(int j = 1;j<len;j++)
{
s[j-1] = s[j];
}
s[len-1] = temp;
}
return s;
}
空間換時間法
就是再開闢一個數組用來接收後len-n位和前n位
char* reverseLeftWords(char* s, int n){
/*空間換時間法*/
char *temp;
int len = strlen(s);
temp = (char *)malloc(sizeof(char)*(len+1));
for(int i = n;i<len;i++)
{
temp[i-n] = s[i];
}
for(int i = 0;i<n;i++)
{
temp[len-n+i] = s[i];
}
temp[len] = '\0';
return temp;
}
庫函式複製法
C語言對於字串提供了許多的字串處理函式。
下面我們主要用到strcpy(str1,str2)
函式(將str2所指的字串複製到str1中 )
和strncpy(str1,str2,n)
函式(將str2所指的前n位複製到str1中)
char* reverseLeftWords(char* s, int n){
/*庫複製函式法*/
char *temp;
int len = strlen(s);
temp = (char *)malloc(sizeof(char)*(len+1));
strcpy(temp,s+n);
strncpy(temp+len-n,s,n);
temp[len] = '\0';
return temp;
}
取餘法
此法可以看作是暴力法的簡化版,取餘法超級絲滑
/*取餘法*/
int i = 0;
int len = strlen(s);
char *temp = malloc(sizeof(char)*(len+1));
while(i<len)
{
*(temp++) = s[(n+i++)%len];
}
*temp = '\0';//擷取長度len
return temp-len;//因為return上面那一步後ans指向的是空字元,return ans-len是讓指標指向第一個字元/*/
}
求逆交換法
不重新開闢一個空間,直接在原數組裡面分段交換字元
但是這種方法需要另外定義一個函式,當然你for寫三遍也不是不行
void reverse(int p,int q,char *s)
{
int i,j;
for(i = p,j = q;i<j;i++,j--)
{
char temp = s[j];
s[j] = s[i];
s[i] = temp;
}
}
char* reverseLeftWords(char* s, int n){
int len = strlen(s);
reverse(0,n-1,s);
reverse(n,len-1,s);
reverse(0,len-1,s);
return s;
}
以上的5種方法可以為我們提供很多思路