左旋字符串
题目要求:
实现一个函数,可以左旋字符串中的K个字符
例如:
ABCDE 左旋1个字符得到:BCDEA
ABCDE 左旋2个字符得到:CDEAB
思路1:
1.先把A字符放到一个临时变量里面
2.字符串n-1个剩余字符向前推进
3.把A放到字符串末尾
void left_rotate(char* str, int k) {
int i;
int n = strlen(str);
for (i = 0; i < k; i++) {
char tmp = *str; //1.将首字符放入临时变量
int j;
for (j = 0; j < n - 1; j++)
{
*(str+j) = *(str + +j + 1); //2.将n-1个字符向前推进
}
*(str + n - 1) = tmp; //3. 将首字符放入字符串末尾
}
}
int main() {
char arr[10] = "abcde";
int k = 2;//需要左旋的字符个数
left_rotate(arr, k);
printf("%s\n", arr);
}
思路2:
1.假设需要左旋2个字符
2.左边逆序
3.右边逆序
4.整体逆序
void left_rotate(char* str, int k) {
int n = strlen(str);
reverse(str, str + k - 1); //1.逆序左旋字符个数
reverse(str + k, str + n - 1);//2.逆序剩余字符个数
reverse(str, str + n - 1);//3.逆序整体字符
}
//逆序字符串
void reverse(char* left, char* right) {
assert(left);
assert(right);
while (left < right) {
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
int main() {
char arr[10] = "abcde";
int k = 2;//需要左旋的字符个数
left_rotate(arr, k);
printf("%s\n", arr);
}
题目2:
写一个函数,判断字符串是否是另一个字符串旋转后的字符串
//把原先的字符串每次都旋转一遍,看是否与另一个字符串相匹配
int is_rotate(char* str, char* str2) {
int i;
int n = strlen(str);
for (i = 0; i < n; i++) {
char tmp = *str; //1.将首字符放入临时变量
int j;
for (j = 0; j < n - 1; j++)
{
*(str + j) = *(str + +j + 1); //2.将n-1个字符向前推进
}
*(str + n - 1) = tmp; //3. 将首字符放入字符串末尾
if (strcmp(str, str2)) {
return 1;
}
}
return 0;
}
char arr1[] = "abcde";
char arr2[] = "bcdea";
int ret=is_rotate(arr1, arr2);
if (ret == 1) {
printf("是旋转后的\n");
}
else {
printf("不是旋转后的\n");
}