将一个字符串左旋n个字符(右旋)再判断一个字符串是否为另外一个字符串旋转之后的字符串。

题目描述:

实现一个函数,可以左旋字符串中的k个字符。

示例:

ABCD左旋一个字符得到BCDA
ABCD左旋两个字符得到CDAB

思绪一:
  1. 反转前k个字符串
  2. 反转剩下的字符串
  3. 再整体反转(这样就是左旋k个字符串)
思绪二:
  1. 再创建一个存储数组
  2. 从字符串第k+1个开始往后的字符赋给存储数组
  3. 再将前k个字符拼接到存储数组中
  4. 将存储数组赋回原数组

代码如下:

#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#if 1 //将 1 改为 0,执行思绪二!
//字符串反转函数
void reverse_part(char *src, int start, int end){
	int i, j;
	char tmp;

	for (i = start, j = end; i < j; i++, j--){
		tmp = src[i];
		src[i] = src[j];
		src[j] = tmp;
	}
}

//左旋函数
void round(char * src, int time){
	int len = strlen(src);
	int pos = time%len;//反转一个字符串的长度等于没有反转(防止输入的数大于字符串长度)

	reverse_part(src, 0, pos - 1);//反转前n个字符串
	reverse_part(src, pos, len - 1);//反转剩下的字符串
	reverse_part(src, 0, len - 1);//整体反转
}
#else
//左旋函数
void round(char * src, int time){
	char tmp[256] = { 0 };
	int len = strlen(src);
	int pos = time % len;//防止输入的数大于数组个数

	strcpy(tmp, src + pos);//从src[pos]开始的数组赋给tmp数组中
	strncat(tmp, src, pos);//将src的前pos个字符拼接到tmp数组后
	strcpy(src, tmp);//将tmp数组赋回src数组中
}
#endif

int main(){
	int input;
	char str[] = "ABCDE";

	printf("请输入左旋的个数:");
	scanf("%d", &input);
	round(str, input);
	puts(str);

	system("pause");
	return 0;
}

代码生成图:
在这里插入图片描述

题目描述:

实现一个函数,可以右旋字符串中的k个字符。

思绪

  • 只需右旋k次,相当于左旋(str长度 - k)次。
  • 字符串ABCD右旋1次:DABC
  • 相当于其左旋3次:DABC

所以如果要通过左旋函数完成右旋,需要知道字符串的长度。

题目描述:

判断一个字符串是否为另外一个字符串旋转之后的字符串

示例:

给定s1 =AABCD和s2 = BCDAA,返回1
给定s1=abcd和s2=ACBD,返回0.

AABCD左旋一个字符得到ABCDA
AABCD左旋两个字符得到BCDAA
AABCD右旋一个字符得到DAABC

思绪:

  1. 将原数组写两遍到存储数组中(这样无论是左旋还是右旋都可以找到)
  2. 存储数组查找另外一个字符串(如果存在返回1,不存在返回0)

代码如下:

#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>
#include<string.h>

int find_round(char * src, char * find){
	char tmp[256] = { 0 };
	strcpy(tmp, src);
	strcat(tmp, src);
	return strstr(tmp, find) ? 1 : 0;//在tmp里面找find
}

int main1(){
	printf("%d\n", find_round("ABCDE", "BCDEA"));

	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值