题意
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
解题思路
将字符串进行三次倒置,如输入: abcdefg 2
如第一次为整体倒置:
abcdefg --> gfedcba
第二次为左边未旋转的子串倒置:
gfedcba --> cdefgba
第三次为右边旋转的子串倒置:
cdefgba --> cdefgab
代码实现
void reverse_str(char *s, unsigned int left, unsigned int right)
{
int i= 0;
char tmp = 0;
if (s == NULL || left >= right)
return ;
/* 对左右边界字符进行调换,调换次数为(right-left+1)/2 向下取整 */
for (i=0; i<(right-left+1)/2; ++i) {
tmp = s[left+i];
s[left+i] = s[right-i];
s[right-i] = tmp;
}
}
char* reverseLeftWords(char* s, int n)
{
int len = 0;
if (s == NULL || n <= 0)
return s;
len = strlen(s);
reverse_str(s, 0, len-1); /* 翻转整体 */
reverse_str(s, 0, len-n-1); /* 翻转左未旋转子串 */
reverse_str(s, len-n, len-1); /* 翻转右旋转子串 */
return s;
}
运行结果
以下为leetcode的运行结果:
总结
坚持!每日一题,欢迎关注我的微信公众号一起讨论!(记录为主)