地址:
力扣https://leetcode-cn.com/problems/zuo-xuan-zhuan-zi-fu-chuan-lcof/
题目:
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
示例 1:
输入: s = "abcdefg", k = 2 输入: s = "lrloseumgh", k = 6 |
限制:
1 <= k < s.length <= 10000 |
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/zuo-xuan-zhuan-zi-fu-chuan-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:
因为可以开辟空间存放,所以最简单的做法就是从切割处开始,后半部依次拷贝到新空间;完成后再从头拷贝到切割处的位置长度到新空间
方法一、前后部分别拷贝
char* reverseLeftWords(char* s, int n){
int i,j;
int len = strlen(s);
char *array = (char *)malloc(sizeof(char)*len + 1);
if(array == NULL)
return NULL;
/* normal method */
for(i=n,j=0; i<len; i++,j++)
{
array[j] = s[i];
}
for(i=0; i<n; i++,j++)
{
array[j] = s[i];
}
array[j]='\0';
return array;
}
方法二、求余拷贝
相对于前后拷贝的方式,我们其实也在找需要拷贝的元素下标
考虑一个整型数,比如 8。那么 0%8=0, 1%8=1...8%8=0。
那么从切割处,比如 5 开始拷贝到末尾后前面的 0,1,2,3,4元素,不也可以通过求余来找到么
char* reverseLeftWords(char* s, int n){
int i,j;
int len = strlen(s);
char *array = (char *)malloc(sizeof(char)*len + 1);
if(array == NULL)
return NULL;
/* advance method */
for(i=0,j=0; i<len; i++,j++)
{
array[j] = s[(i+n)%len];
}
array[j]='\0';
return array;
}
结束语:
以前用 求余 "%" 方式通常用在计算整型数的十位,百位,千位这类,搭配 "/" 完成
数组方式也算是新的一个技巧掌握了