给定一系列字符,按字母顺序返回下一个字符。
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'
答案 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, ' '))