热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

算法题002程序员编程艺术第一章左旋转字符串

算法题002程序员编程艺术第一章左旋转字符串题目描述题目来源:http:blog.csdn.netv_JULY_varticledetails6322882定义字符串

  算法题002 程序员编程艺术第一章 左旋转字符串

 

题目描述

  题目来源:http://blog.csdn.net/v_JULY_v/article/details/6322882

 

  定义字符串的左旋转操作:把字符串前面的若干个(K个)字符移动到字符串的尾部。

  如把字符串abcdef左旋转2位得到字符串cdefab。

  请实现字符串左旋转的函数,要求对长度为n的字符串操作的时间复杂度为O(n),空间复杂度为O(1)

 

题目分析

  如果采用每次将数组中的元素移动一位,循环K次的方法,则时间复杂度为O(K * n),只需要额外的一个存储空间。但是这是不合时间复杂度要求的。

  另外需要注意的是K不一定会小于n,所以需要取K = K % n。

  但是这还是不能实现线性复杂度,编程之美上通过右移字符串提出了一个三次翻转的算法。

 

三次翻转的算法

  可以看到不管是左移还是右移,其结果都是两段子串交换了位置。

  如123abcd这个串,左移三位得到abcd123,实际上是123和abcd交换了位置。

  怎么在线性复杂度内实现这种位置交换呢?三次翻转是这样做到的:

  首先,将123翻转成逆序:321abcd

  然后,将abcd翻转成逆序:321dcba

  最后,将整个串再翻转一遍:abcd123(得到左移结果)。

 

  通常情况的描述:

  1.根据要移动的位数把字符串划分成两段:XY;

  2.翻转X子段;

  3.翻转Y子段;

  4.将得到的结果整个翻转。

 

实现代码

LeftRotate实现

#include
#include
<string>
using namespace std;void ReverseString(string &str)
{
int startID &#61; 0;int endID &#61; str.size() - 1;char temp &#61; &#39; &#39;;while(startID < endID){temp &#61; str[startID];str[startID] &#61; str[endID];str[endID] &#61; temp;&#43;&#43;startID;--endID; }//cout<
}int main(int argc, char* argv[])
{
string str;int k;while(cin >> str >> k){//首先将k取余数&#xff0c;避免k比串长还大的情况k &#61; k % str.size();//cout <<"k: "<//得到子串string x &#61; str.substr(0,k);//cout <<"x: " <string y &#61; str.substr(k,str.size());//cout <<"y" <//需要注意substr()方法含左不含右//三次翻转算法
ReverseString(x);ReverseString(y);string result &#61; x &#43; y;ReverseString(result);cout <<"The final result is: " < endl;}
return 0;
}

  

测试用例

  因为没找到Online Judge&#xff0c;所以自己设计的测试用例&#xff1a;

  输入&#xff1a;

1234567ABDCD 3

123 6

abcd 25

1234567 0

g 10

  输出&#xff1a;

The final result is: 4567ABDCD123

The final result is: 123

The final result is: bcda

The final result is: 1234567

The final result is: g

 

 

参考资料

  程序员编程艺术第一~二十七章集锦与总结

http://blog.csdn.net/v_july_v/article/details/7506231

  程序员编程艺术第一章 左旋转字符串

http://blog.csdn.net/v_JULY_v/article/details/6322882

  搜索到的实现&#xff1a;

http://www.cnblogs.com/aLittleBitCool/archive/2011/02/22/1961267.html

http://www.cnblogs.com/mingzi/archive/2009/08/04/1538482.html

 



推荐阅读
  • 本文分析HashMap的实现原理。数据结构(散列表)HashMap是一个散列表(也叫哈希表),用来存储键值对( ... [详细]
  • EIGRP增强内部网关路由协议协议号88IGRPEIGRP都是CISCO的私有协议.---高级距离矢量协议1、是唯一的一种LSDV的混合协议2、EIGRP拥有目前最快的网络路由收敛 ... [详细]
  • 最近想用js做一个简单的计算器,不过网上的例子好像大部分都是直接从左到右挨个计算,就好像1+2*5,就会先计算1+2,再计算3*5,并没有实现运算符的优先级,这里找到了一种方法实现,来总结一下。不过这 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了mysql中的索引相关的知识,希望对你有一定的参考价值。什么是索引: ... [详细]
  • JS动态生成表格案例 ... [详细]
  • iic协议
    IIC简介IIC,Inter-IntegratedCircuit,集成电路总线,需要2根线连接拓扑,是半双工,适用于”字节型”设备。I2C总线物理拓扑结构IIC通信原理: 通过对S ... [详细]
  • 云计算安全,主要面临哪些威胁?
    云计算是一种新的计算方式,它依托于互联网,以网络技术、分布式计算为基础,实现按需自服务、快速弹性构建、服务可测量等特点的新一代计算方式。然而,任何以互联网为基础的应用都存在着一定危 ... [详细]
  • 贴图的支持及设置:关于贴图分辨率的支持及设置的用户指南
    http:hi.baidu.comdbfr2011818itemeef1eac8df31a2d69744520b贴图分辨率虚幻引擎3支持的贴图分辨率是从1x1到4096x4096 ... [详细]
  • ROC曲线原理及Python实现
    受试者工作特征曲线(receiveroperatingcharacteristiccurve,简称ROC曲线),是比较两个分类模型好坏的可视化工具ROC曲线的作用:1.较容易地查出 ... [详细]
  • DFS基本概念步骤优缺点典型例题递推基本概念直接或者间接调用自身的算法称为递归算法一般数据n ... [详细]
  • delphi控件大全
    本文章已收录于:delphi控件查询:http:www.torry.nethttp:www.jrsoftware.orgTb97最有名的工具条(ToolBar) ... [详细]
  • 转载自:http:www.hbtelecom.com.cndetail.asp?news_id78369_______________________________ ... [详细]
  • 目录结构如下:Nginx基础知识NginxHTTP服务器的特色及优点Nginx的主要企业功能Nginx作为web服务器的主要应用场景包括:Nginx的安装安装环境 ... [详细]
  • 最近用python写了一个小程序,想发布出去让人试用又不想暴露源码,搜索了一下发现将py文件编译成pyd文件就能达到目的。转换过程很简单,但是在调用pyd文件并且打包为单个exe文 ... [详细]
  • 互联网世界 9 种基本的商业模式
    互联网世界9种基本的商业模式一个商业模式是运行一个公司的方法;通过该模式的运作,一个公司能维持自己的生存,就是说,能有收益。商业模式意味着一个公司是如何通过在价值链中定位自己,从而获 ... [详细]
author-avatar
我是刘平2010_327
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有