實現一個函式,可以左旋字串中的k個字元。 ABCD左旋一個字元得到BCDA ABCD左旋兩個字元得到CDAB
阿新 • • 發佈:2018-12-11
(1)暴力旋轉O(N^2)
#include<stdio.h> #include<string.h> void rotate_str(char *str,int k) { int len = strlen(str); while(k%len--) { char ch = str[0]; char *p1 =str; char *p2 = str+1; while(*p2) { *p1 = *p2; p2++; p1++; } *p1 = ch; } } int main() { char str[] = "ABCDEF"; int k = 12; printf("%s\n",str); rotate_str(str,k); printf("%s\n",str); return 0; }
(2)要左旋k個字元,先把前k個字元逆置,再把剩餘的字元逆置,最後整體逆置
#include<stdio.h> #include<string.h> //先逆置k個字元,再把剩餘字元逆置,最後整體逆置 void Swap(char *p1,char *p2) { char tmp = *p1; *p1 = *p2; *p2 = tmp; } void rotate(char *str,int k) { int len = strlen(str); char *p1 = str; char *p2 =str + k%len-1; char *p3 = p2+1; char *p4 = str+len-1; while(p1<=p2) { Swap(p1,p2); p1++; p2--; } while(p3<=p4) { Swap(p3,p4); p3++; p4--; } p1 = str; p4 = str+len-1; while(p1<=p4) { Swap(p1,p4); p1++; p4--; } } int main() { char str[] = "1234abcdef"; int k = 21; printf("%s\n",str); rotate(str,k); printf("%s\n",str); return 0; }
(3)把兩個相同字符合並,建立雙字串,需要旋轉k則從第k個開始取length個
//在一個字串後面再跟一個相同字串(建立雙倍字串) #include<stdio.h> #include<string.h> #include<malloc.h> void rotate(char *msg,int len,int k) { int step = k%len; char *newStr = (char *)malloc(2*len+1); strcpy(newStr,msg); strcat(newStr,msg); strncpy(msg,newStr+step,len); free(newStr); } int main() { char msg[] = "1234abcdef"; int len = strlen(msg); int k = 3; printf("%s\n",msg); rotate(msg,len,k); printf("%s\n",msg); return 0; }