1.实现一个函数,可以左旋字符串中的k个字符。
ABCD左旋一个字符得到BCDA
ABCD左旋两个字符得到CDAB
解题思路:
左旋一次是将第一个字母先保存起来,然后将后面的向前移动一个位置,
然后再将先前第一个保存的字母放在最后的位置,左旋K次,就是将整个过程循环k次。k%len可以减少寻魂的次数。
void rotate_left( char *src, char k)
{
while (k--)//要左旋的最佳次数
{
char temp = *src;//保存字符串的第一个字母
char *cur = src;//让每一次左旋从第一个字母开始
while (*(cur + 1))
{
*cur = *(cur + 1);
cur++;
}
*cur = temp;
}
return src;//始终代表数组的首地址
}
int main()
{
char arr[] = "ABCDEFG";
char len = strlen(arr);//当循环很多次时,和对它长度取余的结果是一样的。
rotate_left(arr, 20%len);
printf("%s\n",arr);
return 0;
}
优化一下吧,如果字符串很长那么得循环很多次,用空间换时间。
比如字符串为ABCDEFGH左旋4次,可以将前四个左右交换再将后面的内容左右交换,然后把整体左右交换。
ABCDEFGH-----DCBAEFGH------DCBAHGFE--------EFGHABCD
void reverse(char *left, char*right)//左右交换left--right的内容
char *temp = left;
while (left < right)
{
char chip = *right;
*right = *left;
*left = chip;
left++;
right--;
}
}
int main()
{
char arr[] = "ABCDEFGH";
char len = strlen(arr);
char k = 5;
reverse(arr, arr + k - 1);//0--k-1交换
reverse(arr+k, arr+len - 1);//k-len-1交换
reverse(arr, arr+len - 1);//0--len-1交换
printf("%s\n",arr);
return 0;
}
总结:调用的函数传的指针直接改变了数组中的内容,打印字符串数组不需要for循环。