字串旋轉面試題
阿新 • • 發佈:2018-12-20
1.實現一個函式,可以左旋字串中的k個字元。 ABCD左旋一個字元得到BCDA ABCD左旋兩個字元得到CDAB
總共有兩種方法:
1.字串旋轉。每左旋一次第一個移到最後一個。
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; void reserve(char* str,int len,int k) { while(k--) { char temp=str[0]; for(int i=0;i<len;i++) { str[i]=str[i+1]; } str[len-1]=temp; } } int main() { int t,len; char str[20]; gets(str); cin>>t; len=strlen(str); t=t%len; reserve(str,len,t); printf("%s\n",str); return 0; }
這種方法簡單但是效率不是很高。
方法二:三次旋轉法。如 abcdef 旋轉3次
第一次:旋轉前三個字元--->cbadef
第二次:把剩下的三個字元旋轉---->cbafed
第三次:整體旋轉:---->defabc
#include<iostream> #include<algorithm> #include<cstdlib> #include<cstring> #include<assert.h> #include<cstdio> using namespace std; void reserve(char* left,char* right) { while(left<right) { char temp=*left; *left=*right; *right=temp; left++; right--; } } void left_move(char* str,int len,int k) { assert(str);//指標有效性的判斷 reserve(str,str+k-1);//逆序需要左旋的部分 reserve(str+k,str+len-1);//逆序整個字串 reserve(str,str+len-1);//逆序其餘字元 } int main() { int t,len; char str[20]; cin>>str; cin>>t; len=strlen(str); t=t%len; left_move(str,len,t); printf("%s\n",str); return 0; }
2.判斷一個字串是否為另外一個字串旋轉之後的字串。 例如:給定s1 =AABCD和s2 = BCDAA,返回1,給定s1=abcd和s2=ACBD,返回0. AABCD左旋一個字元得到ABCDA AABCD左旋兩個字元得到BCDAA AABCD右旋一個字元得到DAABC
方法:
其一是
left_rotate:每次左旋一次,判斷旋轉之後的字串是否與目標字串一致。如果左旋了strlen(str)次,仍然沒有找到,返回0.
#include<iostream> #include<cstdio> #include<cstring> #include<assert.h> #include<algorithm> using namespace std; void reserve(char* left,char* right) { while(left<right) { char temp=*left; *left=*right; *right=temp; left++; right--; } } void left_rotate(char* str,int len,int k) { assert(str);//指標有效性的判斷 reserve(str,str+k-1);//逆序需要左旋的部分 reserve(str+k,str+len-1);//逆序其餘字元 reserve(str,str+len-1);//逆序整個字串 } int is_rotate(char* dest,char* src) { int len=strlen(dest); //如果兩個字串的長度不一致,返回0 if(strlen(dest)!=strlen(src)) return 0; if(!strcmp(dest,src)) return 1; int k=strlen(dest); k=k%len; while(k--) { left_rotate(src,len,1); if(strcmp(dest,src)==0)//判斷旋轉之後的內容是否和目標一致 { return 1; } } return 0; } int main() { char dest[100]; char src[100]; cin>>dest; cin>>src; printf("%d\n",is_rotate(dest,src)); return 0; }
其二是 拼接的方法,但是這種方法可讀性不好哦,不建議使用。