【剑指Offer】题42:左旋转字符串

题目描述:
汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!
输入:
多组测试数据,每个测试数据包含一个字符序列S和非负整数K。其中S的长度不超过1000。
输出:
对应每个测试案例,输出新序列。

样例输入:

UDBOJ 4
abba 1

样例输出:

JUDBO
bbaa
解法1:将前n位保存在辅助数组,然后数组指针后移n位,再将保存的数组拼接到数组中。最后一定要在拼接末尾加上+'\0',然后输出,实际上内存中的字符位置并没有改变,只是输出的效果是前n位翻转的。这种解法也没有利用回文的思路。

#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
****************************************************************/
解法2:之前输入字符串包含两个单词“hello world”(已经过整体翻转),那么翻转每个句子中的单词顺序就得到了“world hello”,可以把“world hello”看成是前面若干个字符移动到后面。两个问题类似,引用此思路的逆向思路将输入“abcdefg”的长度为2的字符串左转为“cdefgab”,可以将“abcdefg”分成两部分分别翻转为“bagfedc”然后将整个字符串翻转即可得到“cdefgab”。

 
 

#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
****************************************************************/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值