当前位置:   article > 正文

C语言进阶之旅(每日一题)字符串左旋_随机产生15个字符的字符向量,实现字符向量向左旋转3位的操作

随机产生15个字符的字符向量,实现字符向量向左旋转3位的操作
  • 左旋 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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

解法 二

  • 层层递进法
  • 把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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

解法 三

  • 三步翻转法
  • 先反转你需要交换的字符个数
  • 然后交换剩下了的
  • 在整体交换
    在这里插入图片描述
#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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

判断一个字符串,是否是他旋转过来的

暴力穷举法

  • 列出全部的可能性和他比较

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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

库函数法

  • 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;
	    }
	

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/1019671
推荐阅读
相关标签
  

闽ICP备14008679号