指针练习

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

问题分析

假设字符串为ABCD
我们从第二个开始左旋
我们可以将这个过程分逐步分解

从第二左旋,意思为从B开始
因此我们将字符串可划分为  A B   CD
我们可以将CD看为一个整体,与B进行位置交换  实现 A CD B
接着将A 与 CD 进行交换  实现 CD A B 达到目的

因此我们可以设定一个指针指向要左旋字符串的前一个位置,另一个指针指向所要左旋字符串的后一个位置,依此来实现交换。
程序实现

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>

void left_move(char *str, int k)
{
	assert(str != NULL);
	char *p1 = NULL;
	char *p2 = NULL;
	char tmp = 0;
	p1 = str ;
	p2 = str;
	int len = strlen(str);
	int i = 0;
	int t = 0;
	for (t = 0; t < k; t++)
	{
		tmp = *(p1 - 1 + k-t);                        //保存前一个要转移的字符
		for (i = 0; i < len - k ; i++)               //后面依次往前移动
		{
			*(p1 + k - 1 + i - t) = *(p1 + k + i - t);
		}
		*(p2 + len - 1 - t) = tmp;                   //将保存的字符向后移动
	}
}
int main()
{
	char arr[50] = { 0 };
	int n = 0;
	printf("请输入字符串:");
	scanf("%s", &arr);
	do
	{
		printf("请输入从第几个字符开始反转(n<=%d):",strlen(arr));
		scanf("%d", &n);
	} while (n <= 0 || n > strlen(arr));
	left_move(arr, n);
	printf("%s\n", arr);
	system("pause");
	return 0;
}
  1. 判断一个字符串是否为另外一个字符串旋转之后的字符串。
    例如:给定s1 =AABCD和s2 = BCDAA,返回1
    给定s1=abcd和s2=ACBD,返回0.

问题分析
此问题为上一问题的延伸
假设所要比较的字符串为:S1=AEBCD S2=BCDAE
我们只需要一次将字符从第一个往最后字符依次左旋,然后依次与S2进行比较
第一步
比较2个字符在左旋0个时是否相同,则2个字符直接比较。
第二步
将字符串划分为 A EBCD
将A 与 ABCD位置交换,达到左旋一次的目的
交换后为ABCD A
与S2比较,不相同,继续比较
第三步
比较左旋2次是否相等,左旋两次只需要在上一次的基础上左旋一次即可得到
上一次左旋后为EBCD A
将其划分为 E BCDA
将A 与 BCDA 进行交换
得到 BCDA E
与S2比较,相同 return 1;

若最后一位左旋完之后还不相同
return 0;
代码实现

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>

int is_left_move(char *str, const char *p)
{
	assert(str != NULL);
	char *p1 = NULL;
	char *p2 = NULL;
	char tmp = 0;
	p1 = str;
	int len = strlen(str);
	int i = 0;
	int k = 0;
	if (strcmp(str, p) == 0)
		return 1;
	for (k = 1; k < strlen(str); k++)
	{
		tmp = *(p1);                         //保存第一个字符
			for (i = 0; i < len-1; i++)   //剩余向前移动
			{
				*(p1 + i) = *(p1 + i + 1);
			}
			*(p1 + len - 1) = tmp;                 //将保存的字符移动到最后位置上
			if (strcmp(str, p) == 0)
				return 1;
	}
	return 0;
}
int main()
{
	char arr[] = "AEBCD";
	char arr1[] = "BCDAE";
	int ret = 0;
	ret = is_left_move(arr, arr1);
	if (ret == 1)
		printf("是\n");
	else
		printf("不是\n");
	system("pause");
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值