-
题目描述:
- 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!
-
输入:
- 多组测试数据,每个测试数据包含一个字符序列S和非负整数K。其中S的长度不超过1000。
-
输出:
- 对应每个测试案例,输出新序列。
样例输入:
UDBOJ 4 abba 1
样例输出:
JUDBO bbaa解法1:将前n位保存在辅助数组,然后数组指针后移n位,再将保存的数组拼接到数组中。最后一定要在拼接末尾加上+'\0',然后输出,实际上内存中的字符位置并没有改变,只是输出的效果是前n位翻转的。这种解法也没有利用回文的思路。
解法2:之前输入字符串包含两个单词“hello world”(已经过整体翻转),那么翻转每个句子中的单词顺序就得到了“world hello”,可以把“world hello”看成是前面若干个字符移动到后面。两个问题类似,引用此思路的逆向思路将输入“abcdefg”的长度为2的字符串左转为“cdefgab”,可以将“abcdefg”分成两部分分别翻转为“bagfedc”然后将整个字符串翻转即可得到“cdefgab”。#include <stdio.h> #include <string.h> #include <stdlib.h> void ReverseLeftChar(char s[],int n) { char *temp = (char*)malloc(n*sizeof(char)); int i=0,length; for(i = 0;i<n ; i++) { temp[i]=*(s+i); } s=s+n; length=strlen(s); for(i=0;i<n;i++) { *(s+length+i)=temp[i]; } *(s+length+n)='\0'; puts(s); free(temp); } int main() { unsigned int n; char s1[50001]=" "; while(scanf("%s %d",s1,&n)!=EOF) { if( n > strlen(s1))n=n%strlen(s1);//不加此句 九度OJ用例2~4 都通不过 ReverseLeftChar(s1,n); } return 1; } /************************************************************** Problem: 1362 User: tcals Language: C Result: Accepted Time:60 ms Memory:912 kb ****************************************************************/
#include <stdio.h> #include <string.h> void ReverseString(char str[],int length) { char *l = str; char *r = str+length-1; char c ; while(l<r) { c = *l; *l = *r; *r = c; l++; r--; } } void main() { char str[10001] = " "; int length ,k; while(scanf("%s%d",str,&k)!=EOF) { length = strlen(str); if(k >= length) k = k % length; ReverseString(str,k); ReverseString(str+k,length-k); ReverseString(str,length); puts(str); } } /************************************************************** Problem: 1362 User: tcals Language: C Result: Accepted Time:60 ms Memory:912 kb ****************************************************************/