有趣的算法-旋转字符串
来源:互联网 发布:手机翻译软件推荐 编辑:程序博客网 时间:2024/06/04 19:51
题目:
给定一个字符串,要求把字符串前面的若干个字符移动到字符串的尾部,如把字符串“abcdef”前面的2个字符'a'和'b'移动到字符串的尾部,使得原字符串变成字符串“cdefab”。请写一个函数完成此功能,要求对长度为n的字符串操作的时间复杂度为 O(n),空间复杂度为 O(1)。
说明:
因为Python的字符串是不可变对象,所以,这里使用了list = ['']代替了C语言里的字符串.
暴力旋转:
#coding:utf8#sorign 原始字符串#starget 目标字符串,需要用来移动的那小段#start 需要移动字符串在原始字符串中的下标#end 目标字符串,最终需要被移动到的在原始字符串的下标位置def shiftCharP(sorigin, starget, start, end): '逐个移位,暴力移位法' leno = len(sorigin) lent = len(starget) offset = end - start print 'leno:%d,lent:%d,offset:%d'%(leno,lent,offset) for i in range(lent): t = sorigin[start] for index in range(offset): sorigin[start + index] = sorigin[start+index+1] print index,' - ',sorigin[start] sorigin[start + offset] = t print "i:%d,start:%d,offset:%d"%(i,start,offset) print starget print sorigin''' 测试代码'''ass = ['1',' ','2','3','4',' ','5','6','7','8',' ','9']ts = ['2','3','4']shiftCharP(ass, ts, 2, len(ass) -1)
巧妙旋转:
说明:
将需要操作的字符串看成一个数组,origin[],将origin分成AB两组,按题目要求实现旋转成BA,A' = A^T, B' = B^T, 反转(A^T+B^T)^T = BA
Python代码:
#coding:utf8def refs(s): '反转数组元素' length = len(s) start = 0 end = length - 1 while start < end: t = s[start] s[start] = s[end] s[end] = t start += 1 end -= 1 return s#s 需要进行操作的数组#end 需要旋转的位置def useRefsToTail(s, end): '旋转移位' #获取总数组长度 length = len(s) #先进行分组,然后内部反转后,再组合 ss = refs(s[:end]) + refs(s[end: length]) print ss #再进行整理反转 ss = refs(ss) print ss return ss''' 以下测试代码:'''s = ['i',' ','l','o','v','e',' ','u']print useRefsToTail(s, 2)
0 0
- 有趣的算法-旋转字符串
- 一道有趣的字符串算法题
- 一个十分有趣的字符串算法题目
- 对旋转字符串算法的理解
- 旋转字符串的三种算法
- 旋转字符串的三种算法
- 旋转字符串算法由浅入深
- 算法 旋转字符串
- 字符串旋转检测算法
- 【算法】旋转字符串
- 【算法】旋转字符串
- 旋转字符串算法由浅入深
- 算法:字符串旋转
- 算法-字符串旋转
- 算法之旋转字符串
- 一个十分有趣的字符串算法, 转载留个记号
- 有趣的字符串
- 有趣的字符串常量
- Linux+tomcat 验证码无法显示
- vim插件和配置
- 禁用系统的Ctrl+Alt+Left/Right(方向键)
- Ubuntu下JNI的使用
- 大数据系列修炼-Scala课程21
- 有趣的算法-旋转字符串
- ci 学习笔记
- 笑笑
- LeetCode 203. Remove Linked List Elements
- git删除分支
- VS2010每次编译都重新编译整个工程的解决方案 仅编译修改过的
- Eclipse打开当前文件所在文件夹--模拟MyEclipse的Open in explorer 功能
- C语言入门-第一周:作业01
- 推进日志——暑期进程1