C语言进阶之旅(每日一题)字符串左旋

Posted 一个正直的男孩

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言进阶之旅(每日一题)字符串左旋相关的知识,希望对你有一定的参考价值。

  • 左旋 1个字符
  • abcd -->bcda
  • 左旋俩个
  • abcd ---->cdab

解法 一

  • 遍历数组法
  1. 首元素地址
     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,判断字符串是否是另一个的字串,是返回地址,不是返回空指针
    在这里插入图片描述
  1. 判断那个字符串是不是他旋转过来那么一定在俩组数据中能找到
    在这里插入图片描述
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语言进阶之旅 (每日一题)杨氏矩阵

C语言进阶之旅 (每日一题)水仙花数

C语言进阶之旅(每日一题)如何成为福尔摩斯

C语言进阶之旅 (每日一题)打印菱形

C语言进阶之旅(每日一题)杨辉三角

我的C语言学习进阶之旅解决 Visual Studio 2019 报错:错误 C4996 ‘fscanf‘: This function or variable may be unsafe.(代码片段