左旋转字符串
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
方法一:分配新空间
1、将s[n – strlen(s) - 1]的字符拷贝到新空间tmp[0 – strlen(s) - n + 1]上
2、再将s[0 – n - 1]的字符拷贝到tmp[strlen(s) - n – strlen(s) - 1]上,返回tmp即可;
char* reverseLeftWords(char* s, int n){
char* tmp = (char*)malloc(sizeof(char) * (strlen(s) + 1));
int index = 0;
for (int i = n; i < strlen(s); i++) {
tmp[index++] = s[i];
}
for (int i = 0; i < n; i++) {
tmp[index++] = s[i];
}
tmp[index] = '\0';
return tmp;
}
也可直接利用C语言的字符串函数
char* reverseLeftWords(char* s, int n){
int len = strlen(s);
char *ret = calloc(len + 1, 1); //len+1:'\0' 重新建立一个连续空间的数组
//char * strncpy ( char * destination, const char * source, size_t num );
//拷贝num个字符从源字符串到目标空间。
strncpy(ret, s + n, len - n);
strncpy(ret + len - n, s, n);
return ret;
}
方法二:不开辟新空间,利用翻转
1、反转区间为前n的子串
2、反转区间为n到末尾的子串
3、反转整个字符串
char* reverseLeftWords(char* s, int n){
/* 翻转前n个字符 */
int left = 0, right = n - 1;
while (left < right) {
char tmp = s[left];
s[left] = s[right];
s[right] = tmp;
left++;
right--;
}
/* 翻转n - strlen(s) - 1个字符 */
left = n;
right = strlen(s) - 1;
while (left < right) {
char tmp = s[left];
s[left] = s[right];
s[right] = tmp;
left++;
right--;
}
/* 翻转全部字符 */
left = 0;
right = strlen(s) - 1;
while (left < right) {
char tmp = s[left];
s[left] = s[right];
s[right] = tmp;
left++;
right--;
}
return s;
}
方法三:利用双指针,和开辟新空间相似
char* reverseLeftWords(char* s, int n){
int len = strlen(s), k = 0;
char *res = malloc((len+1)*sizeof(char));
char *p = s + n;
for(int i = 0; i < len - n; i++){
res[k++] = p[i];
}
for(int i = 0; i < n; i++){
res[k++] = s[i];
}
res[k] = '\0';
return res;
}