一、左旋转字符串
详情见文章参考:
1.暴力移位
void leftShift1(char * arr, int n) //n位移动的位数
{
size_t tmpLen = strlen(arr);
char tmpChar;
int i, j;
if (n >= 0)
{
for (i = 0; i < n; i++)
{
tmpChar = *arr; //tmpchar放入这一轮需要移动的字符
for (j = 0; j < tmpLen - 1; j++)
{
*(arr + j) = *(arr + j + 1);// 除了第一个字符依次向前移位
}
*(arr + tmpLen - 1) = tmpChar;
}
}
else
{
for (i = 0; i < -n; i++) //n为负数反向移动
{
tmpChar = *(arr + tmpLen - 1);
for (j = tmpLen - 1; j > 0; j--)
{
*(arr + j) = *(arr + j - 1);
}
*arr = tmpChar;
}
}
}
另一种实现方式:
//两个函数实现,一次执行函数移动一个字符。m必须为正数
void leftshiftone(char *s,int n) {
char t = s[0]; //保存第一个字符
for (int i = 1; i < n; ++i) {
s[i - 1] = s[i];
}
s[n - 1] = t;
}
void leftshift(char *s,int n,int m) {
while (m--) {
leftshiftone(s, n);
}
}
2.指针移位
每三个字符进行移动
void leftShift2(char * arr, int len, int n)
{
int i;
size_t tmpLen = len;
int p0 = 0;
int p1 = n;
char tmpChar;
/* O(m - n - k) k is the last section*/
while (p1 + n - 1 < tmpLen) //
{
tmpChar = *(arr + p0);
*(arr + p0) = *(arr + p1);
*(arr + p1) = tmpChar;
p0++;
p1++;
}
/*
* not good O(k * (n + k)) k = tmpLen - p1
for(i = 0;i < tmpLen - p1;i++){ //移动后面剩下的
tmpChar = *(arr + tmpLen - 1);
for(j = tmpLen - 1;j > p0;j--){
*(arr + j) = *(arr + j -1);
}
*(arr + p0) = tmpChar;
}
*/
/* good O(k * n) */
while (p1 < tmpLen)
{
tmpChar = *(arr + p1);
for (i = p1; i > p0; i--)
{
*(arr + i) = *(arr + i - 1);
}
*(arr + p0) = tmpChar;
p0++;
p1++;
}
}