C语言进阶之旅(每日一题)字符串左旋
Posted 一个正直的男孩
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言进阶之旅(每日一题)字符串左旋相关的知识,希望对你有一定的参考价值。
- 左旋 1个字符
- abcd -->bcda
- 左旋俩个
- abcd ---->cdab
解法 一
- 遍历数组法
- 首元素地址
2. 字符串元素个数
3. 外循环为小于你所旋的大小
4. 创建俩个指针,一个指向首元素,一个指向的是第二个元素
5. 内循环小于元素个数减一
6. 里面就是交换
void left_revolve(char *p,int str)
{
int k = 0;
scanf("%d",&k);
int i = 0;
for ( i = 0; i < k; i++)
{
char* frist = p;
char* second = p + 1;
int j = 0;
for ( j = 0; j < str-1; j++)
{
if (*frist !='\\0')
{
char tmp = *frist;
*frist = *second;
*second = tmp;
frist++;
second++;
}
}
}
}
int main()
{
char arr[] = "abcd";
int str = strlen(arr);
left_revolve(arr,str);
printf("%s", arr);
return 0;
}
解法 二
- 层层递进法
- 把a备份起来
- 每次赋值,就是吧”空格“换到后面
- 最后把a赋值到最后
#include<string.h>
void left_move(char* a, int k, int sz)
{
int i = 0;
for ( i = 0; i <k; i++)
{
char tmp = *a;
int j = 0;
for ( j = 0; j < sz-1; j++)
{
//前面那个元素和后面那个元素交换
*(a + j) = *(a + j + 1);
}
*(a + sz - 1) = tmp;
}
}
int main()
{
//字符串左旋
char arr[] = "ABCDEF";
int sz = strlen(arr);
int k = 0;
scanf("%d", &k);
left_move(arr,k, sz);
printf("%s", arr);
return 0;
}
解法 三
- 三步翻转法
- 先反转你需要交换的字符个数
- 然后交换剩下了的
- 在整体交换
#include<assert.h>
void reverse(char* left, char* right)
{
assert(left);
assert(right);
while (left<right)
{
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
void left_move(int *arr,int k,int str)
{
reverse(arr, arr + k-1);
reverse(arr + k , arr + str - 1);
reverse(arr, arr + str - 1);
}
int main()
{
char arr[] = "ABCDEF";
int str = strlen(arr);
int k = 3;
left_move(arr, k, str);
return 0;
}
判断一个字符串,是否是他旋转过来的
暴力穷举法
- 列出全部的可能性和他比较
int is_right(char* arr1, char* arr2)
{
int i = 0;
int ret = strlen(arr1);
for ( i = 0; i <ret ; i++)
{
char tmp = *arr1;
int j = 0;
for ( j = 0; j < ret-1; j++)
{
*(arr1 + j) = *(arr1 + j + 1);
}
*(arr1 + ret - 1) = tmp;
if (*arr1 == *arr2)
{
return 1;
}
}
return 0;
}
int main()
{
char arr1[] = "ABCDE";
char arr2[] = "EDCBA";
int ret =is_right(arr1, arr2);
if (ret == 1)
{
printf("yes");
}
else
{
printf("no");
}
return 0;
}
库函数法
- stract,可以在给字符串追加字符
- strncat,可以追加一个和自己一模一样的字符串
- strstr,判断字符串是否是另一个的字串,是返回地址,不是返回空指针
- 判断那个字符串是不是他旋转过来那么一定在俩组数据中能找到
int is_right(char* arr1, char* arr2)
{
int str = strlen(arr1);
int str2 = strlen(arr2);
if (str == str2)
{
strncat(arr1, arr1, str);
char *ret = strstr(arr1, arr2);
return ret!=NULL;
}
}
以上是关于C语言进阶之旅(每日一题)字符串左旋的主要内容,如果未能解决你的问题,请参考以下文章
我的C语言学习进阶之旅解决 Visual Studio 2019 报错:错误 C4996 ‘fscanf‘: This function or variable may be unsafe.(代码片段