剑指Offer之左旋转字符串(Move!Move!!Move!!!)

原创 2013年12月02日 17:35:46

题目描述:
汇编语言中有一种移位指令叫做循环左移(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!!!)
*   来源:http://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;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

剑指Offer详解之左旋转字符串

(1)暴力移位法 这种方法可能是最直观,最容易想出的方法。但这也是最坏的方法。时间复杂度挺高,用这种方法容易超时。 这种方法是一位一位的移动实现左旋转操作。 【代码】 #include #inclu...

七、Sketchup用ruby进行二次开发--利用Transformation实现Move工具(平移、旋转和缩放)

在Sketchup中,move工具使用的非常广泛,

左值和右值move.forward

转自:https://www.ibm.com/developerworks/cn/aix/library/1307_lisl_c11/ 新特性的目的 右值引用 (Rvalue Referene) ...
  • darmao
  • darmao
  • 2017年10月30日 14:27
  • 70

C++ 11 左值,右值,左值引用,右值引用,std::move, std::foward

C++11, 右值引用,move, forward

c++学习-左值右值和std::move初探

本文记录我对左右值的学习,以及std::move语义的学习。基本概念何为左值,何为右值? 区分左值右值的真正说法是:能否用“取地址&”运算符获得对象的内存地址。也即左值其实关联了一块具体内存,但是...

NSButton_Move

  • 2017年12月11日 13:45
  • 83KB
  • 下载

UG OPEN API move

  • 2015年10月19日 21:34
  • 84KB
  • 下载

牛客网刷题之左旋转字符串

题目描述:解题思路:  有一种比较取巧的方法,就是利用StringBuilder的append()方法来实现字符串的分割及合并。    public String LeftRotateString(...

Vb中的MOVE方法例子

  • 2014年01月31日 11:36
  • 9KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:剑指Offer之左旋转字符串(Move!Move!!Move!!!)
举报原因:
原因补充:

(最多只允许输入30个字)