应天论坛

 找回密码
 参与我们

QQ登录

只需一步,快速开始

搜索
查看: 915|回复: 0

如何左旋转字符串

[复制链接]

276

主题

303

帖子

3197

积分

管理员

湘南小侠客

Rank: 9Rank: 9Rank: 9

积分
3197

优质服务勋章论坛元老

QQ
发表于 2017-6-26 13:48:12 | 显示全部楼层 |阅读模式
题目描述:
汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!
输入:
多组测试数据,每个测试数据包含一个字符序列S和非负整数K。其中S的长度不超过1000。
输出:
对应每个测试案例,输出新序列。
样例输入:
UDBOJ 4
abba 1
样例输出:
JUDBO
bbaa
这道题之前在Cracking the Coding interview上做过类似的,一样的三次反转,即可得到,时间复杂度为O(n),空间复杂度为O(1)。这道题在九度OJ上测试,主要要考虑移动的位数大于字符串长度时的情况,取余即可。
AC代码如下:
[mw_shl_code=c,true]#include<stdio.h>  
#include<string.h>  
      
void Swap(char *a,char *b)  
{  
    int temp = *a;  
    *a = *b;  
    *b = temp;  
}  
      
/*
翻转字符串中从start到end的这部分
*/
void ReverseString(char *str,int start,int end)  
{  
    while(start < end)  
    {  
        Swap(&str[start],&str[end]);  
        start++;  
        end--;  
    }  
}  
      
/*
求左旋k位后得到的字符
*/
void ROLString(char *str,int k)  
{  
    if(str == NULL || k<=0)  
        return;  
         
    int len = strlen(str);  
    //要考虑k大于len的情况  
    k = k%len;  
    if(k == 0)  
        return;  
      
    ReverseString(str,0,k-1);  
    ReverseString(str,k,len-1);  
    ReverseString(str,0,len-1);  
}  
      
int main()  
{  
    char str[1010];  
    int k;  
    while(scanf("%s %d",str,&k) != EOF)  
    {  
        ROLString(str,k);  
        puts(str);  
    }  
    return 0;  
}[/mw_shl_code]
每次见你穿短裤打领带,还穿个拖鞋,下次再这样穿不要从我家门口过了!
http://gsh.yzqz.cn/CassettePlayer/index.html

天之道,损有余而补不足.人之道则不然,损不足以奉有余.孰能有余以奉天下,唯有道者.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 参与我们

本版积分规则

QQ|Archiver|手机版|小黑屋|应天社区 ( 湘ICP备17015224号 )

GMT+8, 2024-12-22 13:40 , Processed in 0.078125 second(s), 31 queries .

Powered by Discuz!

© 2001-2017 Comsenz Inc.


免责声明:
本站所发布的第三方软件及资源(包括但不仅限于文字/图片/音频/视频等仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢某程序或某个资源,请支持正版软件及版权方利益,注册或购买,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To: admin@yzqz.cn

快速回复 返回顶部 返回列表