.实现一个函数,可以左旋字符串中的k个字符。 AABCD左旋一个字符得到ABCDA AABCD左旋两个字符得到BCDAA

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

AABCD左旋一个字符得到ABCDA

AABCD左旋两个字符得到BCDAA

方法一:

算法思想:用移的步数作为while循环条件(每移1位完了减1),1位1位的移动,即只需要一个空的变量来存移出去的字符,而这时变量i已经到了数组最后的空位置,此时把先前移

出去的字符再补回来即可

注意

(1)for循环的判断条件是len-1,是因为把i+1赋值给i,而数组元素从0开始占了一位,所以意思是i的有效位是len-2,所以小于len-1刚好

(2)当移动的步数超过字符串长度时,为避免做无用功使用步数%字符串长度的方法来避免

#include <stdio.h>
char move_steps(char *msg ,int steps)
{
	int i=0;
	int len=strlen(msg);
	steps=steps%len;  //保证移动的位数在字符串长度范围内
	while(steps)
	{
		char tmp=msg[0];
		for(i=0;i<len-1;i++)
		{
			msg[i]=msg[i+1];  //每个元素向前挪动位
		}
		msg[i]=tmp;  //这时,i已经加到最后一个空出来的位置,则将开始保存的那个元素再赋值给这个空出来的位置
		steps--;
	}
	//return msg;
}
int main()
{
	char msg[]="abcde123";
	move_steps(msg ,9);
	printf("%s",msg);
	return 0;
}
方法二:

算法思想:以移动的步数为界限,左边字符串整体逆置,右边字符串整体逆置,再整个字符串整体逆置,即需要调用3次整体逆置字符串函数,要注意各个逆置区间的定义

#include <stdio.h>
char reverse_string(char *start, char *end)  //以两个指针指向位区间,进行整体字符串逆置
{
	while(start<end)
	{
		*start=*start^*end;
		*end=*start^*end;
		*start=*start^*end;
		start++;
		end--;
	}
}
int main()
{
	char msg[]="abcde123";
	int steps=25;
	int len=strlen(msg);  //当移动步数大于字符串长度时,避免做出多余的移动
	steps=steps%len;
	reverse_string(msg, msg+steps-1);  //前半部分逆置
	reverse_string(msg+steps, msg+len-1);  //后半部分逆置
	reverse_string(msg, msg+len-1);  //整体再逆置
	printf("%s",msg);
	return 0;
}
方法三:

算法思想:(相当于穷举法)申请一个是原来2倍+1(算上\0)的数组空间,将原来的字符串复制一遍存在这个空间里,然后从原来的首元素加上移动的步数开始输出len个长度的字

符串,完成左旋效果(先后用到strcpy strcat strncpy函数)

注意:

(1)变量定义一定要放在表达式前面,否则乱报错;

(2)用malloc函数申请完空间记得释放,头文件<stdlib.h>

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void reverse_string(char *msg, int steps)
{
	int len=strlen(msg);
	//steps=steps%len;
	char *tmp=(char*)malloc(2*len+1); //申请2倍的原数组空间
	steps=steps%len;
	strcpy(tmp,msg);  //把原来的字符串拷贝到这个大空间里
	strcat(tmp,msg);  //把原来的字符串再拼接到后面(复制2遍)
	strncpy(msg,msg+steps,len);  //从要移动的位数后一位起,获取原来长度的字符串,达到左旋效果
	free(tmp);

}
int main()
{
	char msg[]="abcde123";
	reverse_string(msg, 2);
	printf("%s",msg);
	return 0;
}




  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值