程序员成长之旅——C语言旋转字符函数实现

程序员成长之旅——C语言旋转字符函数实现

题目介绍

实现一个函数,可以左旋字符串中的k个字符。
ABCD左旋一个字符得到BCDA
ABCD左旋两个字符得到CDAB

方法一

采用循环移位,对需要旋转的k个字符按顺序进行旋转,先将要旋转的一个字符保存起来,将后面的往前挪动一位,再将保存起来的这个字符赋给最后一位,这样连续循环k次。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void left_remove(char* p, int n, int len)
{
 	int i = 0;
 	for (i = 0; i < n; i++)
 	{
  		int j = 0;
  		int tmp = p[0];
  	for (j = 0; j < len - 1; j++)
  	{
   		p[j] = p[j + 1];
  	}
  		p[len - 1] = tmp;
 	}
}
int main()
{
 	char p[] = "ABCD";
 	int n = 0;
 	int len = strlen(p);
 	printf("左旋前字符串为:>");
 	printf("%s\n", p);
 	printf("左旋几位:>");
 	scanf_s("%d", &n);
 	while (n<1 || n>len - 1)
 	{
  	if (n == len || n == 0)
  	{
   		printf("左旋后字符串为:>");
   		printf("%s", p);
   		return 0;
  	}
  	else
  	{
   		printf("输入有误!\n");
   		scanf_s("%d", &n);
  	}
 }
 	left_remove(p, n, len);
 	printf("旋转后:%s\n", p);
 	system("pause");
 	return 0;
}

在这里插入图片描述

方法二

俗称三步旋转法:
先将要左旋的字符进行旋转,再将未左旋的字符进行旋转,最后所有字符进行旋转,即得到所需字符。比如 ABCD 要将 AB 字符旋转 得到的应该是:CDAB 按照上面所说的即为 BACD->BADC->CDAB不难看出来所得是一样的。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void reserve(char* left,char* right)
{
 	while (left < right)
 	{
  		char tmp = *left;
  		*left = *right;
  		*right = tmp;
  		left++;
  		right--;
 	}
}
void left_remove(char* p, int n, int len)
{
 	reserve(p, p + n - 1);
 	reserve(p + n, p + len - 1);
 	reserve(p, p + len - 1);
}
int main()
{
 	char p[] = "ABCD";
 	int n = 0;
 	int len = strlen(p);
 	printf("左旋前字符串为:>");
 	printf("%s\n", p);
 	printf("左旋几位:>");
 	scanf_s("%d", &n);
 	while (n<1 || n>len - 1)
 	{
  	if (n == len || n == 0)
 	{
   		printf("左旋后字符串为:>");
   		printf("%s", p);
   		return 0;
  	}
 	else
  	{
   		printf("输入有误!\n");
   		scanf_s("%d", &n);
  	}
 }
 	left_remove(p, n, len);
 	printf("旋转后:%s\n", p);
 	system("pause");
 	return 0;
}

在这里插入图片描述

方法三

指针实现

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void left_remove(char arr[], int n)     
{
 	char arr1[5] = { 0 };
 	char* mov1 = arr;
 	char* mov2 = arr;
 	char* res1 = arr1;
 	char* res2 = arr1;
 	while (n--)
 	{
  		*res1++ = *mov2++;
 	}
 	while (*mov2)
 	{
  		*mov1++ = *mov2++;
 	}
 	while (*mov1)
 	{
  		*mov1++ = *res2++;
 	}
}
int main()
{
 	char p[] = "ABCD";
 	int n = 0;
 	int len = strlen(p);
 	printf("左旋前字符串为:>");
 	printf("%s\n", p);
 	printf("左旋几位:>");
 	scanf_s("%d", &n);
 	while (n<1 || n>len - 1)
 {
  	if (n == len || n == 0)
  	{
   		printf("左旋后字符串为:>");
   		printf("%s", p);
   		return 0;
  	}
  	else
  	{
   		printf("输入有误!\n");
   		scanf_s("%d", &n);
  	}
 }
 	left_remove(p, n);
 	printf("旋转后:%s\n", p);
 	system("pause");
 	return 0;
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/wuweiwuju___/article/details/93842138