2016-08-25 2 views
1

Учитывая последовательность символов, верните следующее в алфавитном порядке.Приращение символа с заданной последовательностью

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' 
+1

просто общее решение есть те были в базе-26 ... преобразовать в базу-10, а затем добавить к нему 1 ... снова преобразовать в базу-26 ... –

+0

@ lokesh1729 есть одна маленькая проблема этот подход. Какая буква соответствует нулю? –

+1

да, мы должны заботиться, когда число делится на ноль ... тогда нам нужно взять остаток как 26, а quotient = quotient-1 ... скажем 52 .. 52/26 = 2, поэтому q = 1, rem = 26, которое дает AZ –

ответ

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 
+0

Слишком плохо, что ваша программа никогда не возвращает« Z ». –

+0

'[convert (i, '') для i в диапазоне (50)] ['@', 'A', 'B', 'C', 'D', 'E', 'F', 'G ',' H ',' I ',' J ',' K ',' L ',' M ',' N ',' O ',' P ',' Q ',' R ',' S ',' 'T', 'U', 'V', 'W', 'X', 'Y', 'A', 'AA', 'AB', 'AC', 'AD', 'AE', 'AF ',' AG ',' AH ',' AI ',' AJ ',' AK ',' AL ',' AM ',' AN ',' AO ',' AP ',' AQ ',' AR ',' «AS», «AT», «AU», «AV», «AW»] ' –

+0

@ VladNikiporoff missed = in if condition ... –

1

Try:

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) 
1

Вот решение, которое просто использует манипуляции со строками.

Оставив в стороне нормализацию строки (прописной его, полосы заготовок), функция, по существу находит суффикс, состоящий из необязательной буквы, кроме Z с последующим любым количеством Z с (не включая ни одного). Конечный Z s изменен на A, а последний символ до Z s (если есть) увеличивается. Наконец, добавляется A, если строка состоит только из Z s.

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, ' '))