zoukankan      html  css  js  c++  java
  • 左旋转字符串,翻转字符串

    1.题目描述

    汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!
    解法1
    注意在特殊处理时,返回‘’,不能返回None
     1 # -*- coding:utf-8 -*-
     2 class Solution:
     3     def LeftRotateString(self, s, n):
     4         # write code here
     5         ss = ''
     6         if len(s)==0 or n<0 or n>len(s):
     7             return ss
     8         if n==0 or n==len(s):
     9             return s
    10         ss = s[n:]+s[0:n]
    11         return ss

    解法2

    利用三次翻转

     1 # -*- coding:utf-8 -*-
     2 class Solution:
     3     def LeftRotateString(self, s, n):
     4         # write code here
     5         # 使用翻转
     6         if len(s) == 0 or n > len(s):
     7             return ''
     8         if n == 0 or n == len(s):
     9             return s
    10         s = self.reverse(s, 0, n - 1)
    11         s = self.reverse(s, n, len(s) - 1)
    12         s = self.reverse(s, 0, len(s) - 1)
    13         return ''.join(s)
    14 
    15     def reverse(self, s, start, end):
    16         s = list(s)
    17         while start < end:
    18             temp = s[start]
    19             s[start] = s[end]
    20             s[end] = temp
    21             start += 1
    22             end -= 1
    23         return s

    note

    在python中,字符串是不可变对象,

    不能通过下标的方式直接赋值修改。同样的不可变对象还有:数字、字符串和元组。

    所以修改时,可以将字符串转换为列表再连接为字符串

     

    2.题目描述

    牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么
    思路:
    整体旋转,再每个单词进行旋转,在每个单词旋转时,记录单词开始和结束地方,另外,对特殊输入的处理,如就一个单词
    # -*- coding:utf-8 -*-
    class Solution:
        def ReverseSentence(self, s):
            # write code here
            # 整体翻转,单个单词翻转
            if len(s) == 0:
                return ''
            s = self.reverseCore(s,0,len(s)-1) # 整体翻转
            
            begin = 0
            end = 0
            while end < len(s) and begin<len(s):
                if s[end]==' ' :
                    # 单个单词翻转,记录每个单词开始结束位置
                    s = self.reverseCore(s,begin,end-1)
                    begin = end +1
                if end == len(s)-1:# 结尾的处理,特殊输入(一个单词)
                    s = self.reverseCore(s, begin, end)
                end = end+1
            return ''.join(s)
    
        def reverseCore(self, s, start, end):
            s = list(s)
            #mid = (start+end)>>1 # eg start=7,end=8时,(7+8)>>1 = 7 如果使用/2,(0+3)/2,mid = 1.5
            while start <end:
                s[start], s[end] = s[end], s[start]
                start += 1
                end -= 1
            return s
  • 相关阅读:
    tornado开发学习之2.输入输出,数据库操作,内置模板,综合示例
    使用Python读取和写入mp3文件的id3v1信息
    在CentOS中部署Python和配置PyCharm开发环境
    Quartz Cron 表达式(时间格式的写法)
    使用Atomikos Transactions Essentials实现多数据源JTA分布式事务
    Grub4dos 硬盘引导 iso 文件
    NFS配置
    C++程序加载Flash动画
    在boost.foreach中操作迭代器
    WebContents类
  • 原文地址:https://www.cnblogs.com/shuangcao/p/12801096.html
Copyright © 2011-2022 走看看