一、字符串的左逆序
有这样一个字符串,“abcdefg",现在需要这个字符串往左边逆序一个字母,得到”bcdefga"。请用代码展示。
解题思路:
当我们左旋转移动N个字符时,第N+1个字符移到第一个字符的位置,后面的字符依次往上移,移动的字符依次落在末尾字符的后面,思路可见下图
以上就是我们整个代码的思路。
1.分装函数写法:
(1)代码演示:
int left_move(char *arr, int k)
{
int len = strlen(arr);
for (int j = 0; j < k; j++)
{
char tmp = *arr;
for (int i = 0; i < len - 1; i++)
{
*(arr + i) = *(arr + i + 1);
}
*(arr + len - 1) = tmp;
}
return arr;
}
int main()
{
char arr[20] = "abcdefg";
int k = 0;
scanf("%d", &k);
left_move(arr, k);
printf("%s\n", arr);
return 0;
}
left_move函数中创造一个tmp存放字符串中的第一个字符,使第一个字符的位置空出来用于后面字符的挪位。最后把字符串空出来的位置放入我们移动的字符。
2.三步逆序 :
以上是我们比较能想到的解题方法,这里也有另一个方法,相对于上面的方法,相对简单一些,但不易想到。
(1)三步逆序的思路:
我们先把我们所需要逆序的几个字符串看为一个整体,先把它们逆序,再把剩下的字符看为一个整体逆序,最后把它们逆序的结果看为一个整体,最后整体逆序就是我们逆序字符的最终的结果了,不明白的话,我们还是看图解释吧。
(2)代码演示
首先我们还是要先写一个main函数。在main函数中,我们还是需要使用scanf函数来录入我们需要逆序几个字符,传入我们新创建的left_move函数中
int main()
{
char arr[20] = "abcdefg";
int k = 0;//逆序几个字符
scanf("%d", &k);
left_move(arr, k);
printf("%s\n", arr);
return 0;
}
在left_move函数中我们需要逆序,因此我们在此函数中写一个逆序函数
void left_move(char* arr, int k)
{
int len = strlen(arr);
reverse(arr, arr+k-1);
reverse(arr+k, arr + len - 1);
reverse(arr, arr+len-1);
}
在这个逆序函数中,我们需要实现字符串的逆序,还是在逆序函数中创建一个新的变量放挪动的字符,再把后面的字符移动到挪动的字符原本的位置,最后把挪动的字符放入后面字符的位置中,关于这个想法,我们也可以画图解释
有了这个思路,我们就可以写出我们的逆序函数了。
void reverse(char* left, char* right)
{
while (left <= right)
{
char tmp = *left;
*left = *right;
*right = tmp;
*left++;
*right--;
}
}
分板块写完之后,我们可以凑在一起看看这个代码的实现。
整体代码:
void reverse(char* left, char* right)
{
while (left <= right)
{
char tmp = *left;
*left = *right;
*right = tmp;
*left++;
*right--;
}
}
void left_move(char* arr, int k)
{
int len = strlen(arr);
reverse(arr, arr+k-1);
reverse(arr+k, arr + len - 1);
reverse(arr, arr+len-1);
}
int main()
{
char arr[20] = "abcdefg";
int k = 0;//逆序几个字符
scanf("%d", &k);
left_move(arr, k);
printf("%s\n", arr);
return 0;
}
二、判断一个字符串是不是由另一个字符串旋转得来
这道题其实与我们上面所写的题到差不差,因为主要思路其实都是一样的,这道题只是比上一道题多了一个判断罢了。
解题思路:
如果一个字符串arr2是由另一个字符串arr1旋转的来,那么把让字符串arr1自己追加自己,这里可以使用我们前面讲的字符函数,我们可以使用strncat(为啥不使用strcat可以看看之前我写的字符串函数那篇文章,那里详细解答了strcat函数的功能及使用)最后我们使用strstr函数去查找我们的arr2是否能在我们追加后的arr1中找到,如果不是则返回NULL
(1)利用字符函数(strstr,strncat)实现:
int is_left_move(const char* arr1, const char* arr2)
{
int len1 = strlen(arr1);
int len2 = strlen(arr2);
if (len1 != len2)
{
return 0;
}
strncat(arr1, arr1, len1);
if (strstr(arr1, arr2) == NULL)//返回空指针意味着不是旋转的来的
{
return 0;
}
else
{
return 1;
}
}
int main()
{
char arr1[30] = "abcdef";
char arr2[] = "cdefab";
int len = strlen(arr1);
int m=is_left_move(arr1, arr2);
if (m==1)
{
printf("YES\n");
}
else
printf("NO\n");
return 0;
}
(2)用函数strcmp字符函数判断
当然了,我们如果对字符函数不熟悉,想自己用代码实现这个功能,也是可以滴。
我们可以借鉴前面的那个字符串的逆序,每逆序一个字符我们就判断一次逆序后的字符串是不是与arr2相等,用我们的strcmp函数判断我们的arr1与arr2是否相等,若相等则返回0。以上就是我们大多数可以想到的一个解题思路,还是看看我们的代码吧。
int is_left_move(char *arr1, char*arr2)
{
int len = strlen(arr1);
int ret = 0;
for (int j = 0; j < len; j++)
{
char tmp = arr1;
for (int i = 0; i < len - 1; i++)
{
*(arr1 + i) = *(arr1 + i + 1);
}
*(arr1 + len - 1) = tmp;
if (strcmp(arr1,arr2)==0)
{
ret = 1;
}
}
return ret;
}
int main()
{
char arr1[] = "abcdef";
char arr2[] = "cdefab";
int len = strlen(arr1);
int m=is_left_move(arr1, arr2);
if (m==0)
{
printf("YES\n");
}
else
printf("NO\n");
return 0;
}
好咯,今天小陈的分享就到这里咯,希望对各位有帮助,还是老样子,欢迎大家在评论区留言纠错,蟹蟹!