实现字符串循环右移N位(改进版)

/**********************************************************************
 * RightMove.cpp
 * Compiler: GCC,VS,VC6.0  win32
 * Author:WK
 ************************************************************************/  

void RightLoopMove(char *pStr, unsigned short steps)
{
	int len = strlen(pStr);
	steps %= len; //可以增加程序健壮性,对于较大的移动可以进行长度取余,减少不必要的循环移动
	if(0 ==steps )
		return;

	char tmp;//只借用一个空间
	while(steps > 0)
	{
		tmp = pStr[len-1];
		for(int i=len-1; i>0; --i)
		{
			pStr[i] = pStr[i-1];
		}
		pStr[0] = tmp;
		steps--;
	}
}

void main()
{
	char str[] = "abcdefghi";
	cout<<str<<endl;
	RightLoopMove(str,2);
	cout<<str<<endl;
}

/*借用空间较大,并且借助了库函数,程序效率不高
void RightLoopMove(char *pStr, unsigned short steps)
{
	int len = strlen(pStr);
	steps %= len;
	if(steps == 0)
		return;

	char *data = (char *)malloc(sizeof(char)*len+1);
	strcpy(data,pStr+(len-steps));
	strncat(data,pStr,len-steps);
	strcpy(pStr,data);
	free(data);
}
*/
void main()
{
	char str[] = "abcdefghi";
	cout<<str<<endl;
	RightLoopMove(str,901);
	cout<<str<<endl;
}
时间: 2024-10-11 08:19:42

实现字符串循环右移N位(改进版)的相关文章

【C语言】请实现字符串循环右移函数。列如字符串“abcdefghi”向右移2位就是“hiabcdefg”

// 请实现字符串循环右移函数.列如字符串"abcdefghi"向右移2位就是"hiabcdefg" // 函数原型为:void RightLoopMove(char *pstr,unsigned short steps) #include <stdio.h> #include <assert.h> #include <string.h> void severse(char *p,char *q) //字符串翻转 { char t

C递归实现字符串循环右移

设计一个函数轮转字符串.例如将“abcd”转为"dabc" 递归实现方式: 1 /*将字符串循环右移n个单位*/ 2 void move(char s[], int n) 3 { 4 if( n == 0) 5 return ; 6 else{ 7 int len = strlen(s); 8 int temp = s[len-1]; 9 int i; 10 for( i = len-1; i > 0 ; --i) 11 { 12 s[i] = s[i-1]; 13 } 14 s

实现将一维数组A(下标从1开始)中的元素循环右移k位,要求只用一个元素大小的辅助空间

#include<stdio.h>main(){ int n,arrary[50],k,temp; printf("请输入数组元素个数:\n"); scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&arrary[i]); printf("请输入数组需要向后移动的大小:\n"); scanf("%d",&k);if(k

经典算法——数组的循环右移K位

void Reverse(vector<int>&nums,int p,int q) { for(;p<q;p++,q--) { int temp=nums[q]; nums[q]=nums[p]; nums[p]=temp; } } void RightShift(vector<int> nums,int k) { int n=nums.size(); k%=n; Reverse(nums,0,n-k-1); Reverse(nums,n-k,n-1); Rever

1008. 数组元素循环右移问题 (20)

1008. 数组元素循环右移问题 (20) 一个数组A中存有N(N>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(M>=0)个位置,即将A中的数据由(A0 A1--AN-1)变换为(AN-M -- AN-1 A0 A1--AN-M-1)(最后M个数循环移至最前面的M个位置).如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法? 输入格式:每个输入包含一个测试用例,第1行输入N ( 1<=N<=100).M(M>=0):第2行输入N个整数,之间用空格

PAT-BASIC-1008-数组元素循环右移问题

一个数组A中存有N(N>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(M>=0)个位置,即将A中的数据由(A0 A1……AN-1)变换为(AN-M …… AN-1 A0 A1……AN-M-1)(最后M个数循环移至最前面的M个位置).如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法? 输入格式:每个输入包含一个测试用例,第1行输入N ( 1<=N<=100).M(M>=0):第2行输入N个整数,之间用空格分隔. 输出格式:在一行中输出循环右移M位以

【算法编程】循环右移一个数组

仅用一个辅助节点将一个大小为n数组循环右移k位的三种办法: 1.时间复杂度最大:将所有元素每次只移动一位,总共移动k次,程序实现十分容易,在此就不具体实现了. 2.时间复杂度适中:依次将每个元素都放到辅助节点上,然后将其储存到目的节点,具体程序如下: #include<iostream> using namespace std; int gcd(int x,int y); int main() { int n,k; cout<<"请输入数组的维数"<<

PAT 乙级 水题 1008. 数组元素循环右移问题 (20)

时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 一个数组A中存有N(N>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(M>=0)个位置,即将A中的数据由(A0A1--AN-1)变换为(AN-M -- AN-1 A0 A1--AN-M-1)(最后M个数循环移至最前面的M个位置).如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法? 输入格式:每个输入包含一个测试用例,第1行输入N ( 1<=N<=

数组循环右移

Q:把一个含有 N 个元素的数组循环右移 K 位,要求时间复杂度为 O (N),且只允许使用两个附加变量. 开始的思路: 1.若k=整数倍N, 完成:k大于N,k=N%k:k小于N,开始处理. 2.tmp1保存取出的元素a[k]:a[0]放在k:tmp2保存a[2k], tmp1放入2k:tmp1保存a[3k],tmp2放入3k...直到位置[0]被放入一个新值,一轮循环完毕.这是一个从位置[0]出发,又回到位置[0]的接龙游戏. 仔细考虑下,发现,若N%k==0,则需要从[0]开始,[0]结束