左旋字符串
1. 什么是左旋字符串?
把字符串前面的若干个字符移动到字符串尾部。
例如把 abcd 左旋转 2 位得到字符串 cdba。
2. 方式一
void left_remove(char arr[], int k)
{
int length = strlen(arr);
for (int i = 0; i < k; ++i)
{
//首先保存第一个位置元素
char temp = arr[0];
//将其后的元素依次前移一位
for (int j = 0; j < length - 1; ++j)
{
arr[j] = arr[j + 1];
}
//将第一个字符放到最后
arr[length - 1] = temp;
}
}
图示:
3. 方式二(三步反转法)
例如字符串 abcdef ,若要左旋2个字符,只要按下述3个步骤操作即可:
-
首先分为俩部分,X:ab,Y:cdef;
-
将X反转,即得:ab->ba;将Y反转,即得:cdef->fedc。
-
反转上述得到的结果字符串,即bafedc给予反转,得cdefab。
void left_remove2(char arr[], int k) { int length = strlen(arr); //首先将前k个字符逆序 例:abcdef(左旋2)->首先将前两个字符ab逆序->bacdef reverse(arr, arr + k - 1); //再将剩下的字符逆序 ->再将剩下的字符cdef逆序 -> bafedc reverse(arr + k, arr + length - 1); //最后将整体逆序 ->再将整个的字符串bafedc逆序 -> cdefab reverse(arr, arr + length - 1); } /** * 反转字符串函数 * @param left 字符串开始位置地址 * @param right 字符串结束位置地址 */ void reverse(char *left, char *right) { char temp; //当左地址小于右地址,依次交换左右两个位置元素(类似二分查找) while (left < right) { temp = *left; *left = *right; *right = temp; left++; right--; }
图示: