一、左旋转字符串
详情见文章参考:
- github:程序员编程艺术
- csdn:程序员编程艺术第一章
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 - p1for(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++;}
}