给定序列增加一个char

时间:2016-08-25 06:52:11

标签: python string algorithm

给定一系列字符,按字母顺序返回下一个字符。

Example: given 'A' it should return 'B', 'Z' -> 'AA', 'ZYZ' -> 'ZZA'

使用模数和数学的一个相关参考我找到了is in c#。 我提出了自己的解决方案,而不是将其转换为python。

什么是比下面更有效的算法方法?

import string
def increment_excel(s=''):
    """
    A->B, Z->AA, AZ->BA, KZZ->LAA
    """
    def wrapped(s):
        if not s: 
            return string.uppercase[0]
        ind = string.uppercase.index(s[-1])
        if ind < len(string.uppercase) - 1: 
            return s[:-1] + string.uppercase[ind + 1]
        return wrapped(s[:-1]) + string.uppercase[0]
    return wrapped(s.upper().replace(' ',''))


increment_excel('TRYME') # -> 'TRYMF'
increment_excel('TRY ZZ') # -> 'TRZAA'
increment_excel('ABCC') # -> 'ABCD'
increment_excel('ZZ Z') # -> 'AAAA'

3 个答案:

答案 0 :(得分:1)

请检查我的解决方案,我从我这边测试过它。

def seqconverter(a):
    def converter(number):
        retval = str()
        while number:
            x = (number - 1) % 26
            number = (number - 1) / 26
            retval = '%s%s' % (chr(x + 65), retval)
        return retval

    def numconverter(a):
        res = 0
        for c in a:
            res *= 26
            res += ord(c) - 64
        return res
    return converter(numconverter(a) + 1)

if __name__=='__main__':
    print(seqconverter('ZYZ'))
    print(seqconverter('ZZA'))
    print(seqconverter('XY'))

输出:

ZZA
ZZB
XZ


------------------
(program exited with code: 0)
Press return to continue

答案 1 :(得分:1)

尝试:

def increment_excel(s=''):
    arr = list(s.upper().replace(' ', ''))
    if arr:
        arr.reverse()
        n = 1
        for i in range(len(arr)):
            if ord(arr[i])+n <= ord('Z'):
                arr[i] = chr(ord(arr[i]) + n)
                n = 0
            else:
                arr[i] = 'A'
                n = 1
        if n == 1:
            arr.append('A')
        arr.reverse()
    return ''.join(arr)

答案 2 :(得分:1)

这是一个只使用字符串操作的解决方案。

除了字符串的规范化(大写它,条带空白)之外,该函数基本上找到的后缀由 Z 之外的可选字母组成,后跟任意数量的 Z s(包括没有)。尾随 Z 全部更改为 A ,而 Z 之前的最后一个字符(如果有)则递增。最后,如果字符串仅由 Z 组成,则前缀 A

import re
import string
succ_tb = string.maketrans(string.uppercase,
                           string.uppercase[1:]+string.uppercase[0])
up_tb = string.maketrans(string.lowercase, string.uppercase)
suff_re = re.compile('(([A-Y]?)Z*)$')

def increment_excel(s):
  return suff_re.sub(
    lambda m: (('' if m.group(2) else 'A') + 
               m.group(1).translate(succ_tb)),
    s.translate(up_tb, ' '))