剑指Offer之左旋转字符串(Move!Move!!Move!!!)
- 题目描述:
- 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!
- 输入:
- 多组测试数据,每个测试数据包含一个字符序列S和非负整数K。其中S的长度不超过1000。
- 输出:
- 对应每个测试案例,输出新序列。
- 样例输入:
-
UDBOJ 4 abba 1
- 样例输出:
-
JUDBO bbaa
思路源于前一篇文章思路:反转单词顺序
【代码】
/********************************* * 日期:2013-12-02 * 作者:SJF0115 * 题号: 题目1362:左旋转字符串(Move!Move!!Move!!!) * 来源:https://ac.jobdu.com/problem.php?pid=1362 * 结果:AC * 来源:剑指Offer * 总结: **********************************/ #include <stdio.h> #include <malloc.h> #include <string.h> char *str; //反转单词 void ReverseWord(char* words,int begin,int end){ int temp; if(words == NULL || begin > end || begin < 0){ return; } //反转 while(begin < end){ temp = words[begin]; words[begin] = words[end]; words[end] = temp; begin ++; end --; } } char* Reverse(char* str,int n){ if(str == NULL || n < 0){ return ""; } int len = strlen(str); //分成两部分(1)前n项(2)剩余项 //反转前n个 ReverseWord(str,0,n-1); //反转剩余 ReverseWord(str,n,len-1); //全部反转 ReverseWord(str,0,len-1); return str; } int main() { int i,n; str = (char*)malloc(sizeof(char)*1001); while(scanf("%s",str) != EOF){ scanf("%d",&n); //左旋转 //注意一下n需要取余就可以了,不能超过字符串自身的长度 n = n % strlen(str); str = Reverse(str,n); //输出 for(i = 0;i < strlen(str);i++){ printf("%c",str[i]); } printf("\n"); }//while return 0; }
最后更新:2017-04-03 14:54:27