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

编程知识 行业动态 更新时间:2024-06-13 00:20:06
  • 左旋 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语言进阶之旅(每日一题)字符串左旋

本文发布于:2023-03-29 10:59:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/672cf4466a0c7fb47535bf6b8f7bbc93.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:进阶   之旅   字符串   左旋   语言

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!