Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 添加字符在前面添加一个字符_Python_Algorithm - Fatal编程技术网

Python 添加字符在前面添加一个字符

Python 添加字符在前面添加一个字符,python,algorithm,Python,Algorithm,我试图实现的是一个将字符串递增一个字符的函数,例如: 'AAA' + 1 = 'AAB' 'AAZ' + 1 = 'ABA' 'ZZZ' + 1 = 'AAAA' 我已经实现了前两种情况下的函数,但是我想不出第三种情况下的任何解决方案 这是我的密码: def new_sku(s): s = s[::-1] already_added = False new_sku = str() for i in s: if not already_added

我试图实现的是一个将字符串递增一个字符的函数,例如:

'AAA' + 1 = 'AAB'
'AAZ' + 1 = 'ABA'
'ZZZ' + 1 = 'AAAA'
我已经实现了前两种情况下的函数,但是我想不出第三种情况下的任何解决方案

这是我的密码:

def new_sku(s):
    s = s[::-1]
    already_added = False
    new_sku = str()

    for i in s:
        if not already_added:
            if (i < 'Z'):
                already_added = True
            new_sku += chr((ord(i)+1)%65%26 + 65)
        else:
            new_sku += i

    return new_sku[::-1]
def新库存单位:
s=s[:-1]
已添加=错误
新sku=str()
对于s中的i:
如果尚未添加:
如果(i<'Z'):
已添加=真
新sku+=chr((ord(i)+1)%65%26+65)
其他:
新的_sku+=i
返回新的_sku[:-1]
有什么建议吗?

怎么样

def new_sku(s):
    s = s[::-1]
    already_added = False
    new_sku = str()

    for i in s:
        if not already_added:
            if (i < 'Z'):
                already_added = True
            new_sku += chr((ord(i)+1)%65%26 + 65)
        else:
            new_sku += i

    if not already_added: # carry still left?
        new_sku += 'A'

    return new_sku[::-1]

我会像带进位的base-26加法器一样实现这一点

因此,从字符串的右侧开始,添加1。如果到达Z,则换行到A并将下一个最左侧的字符向上碰撞一个。如果最左边的字符达到Z,则在字符串的左边添加一个A

s = ["Z","Z","Z"]
done = 0

index = len(s) - 1
while done == 0:
    if s[index] < "Z":
        s[index] = chr(ord(s[index]) + 1)
        done = 1
    else:
        s[index] = "A"
        if index == 0:
            s = ["A"] + s
            done = 1
        else:
            index = index - 1

print s
s=[“Z”、“Z”、“Z”]
完成=0
索引=len(s)-1
完成时==0:
如果s[索引]<“Z”:
s[index]=chr(ord(s[index])+1)
完成=1
其他:
s[索引]=“A”
如果索引==0:
s=[“A”]+s
完成=1
其他:
索引=索引-1
印刷品

只需检查字符串是否全部为
Z
s,如果是,则将其替换为长度为
len(s)+1
的字符串,仅由
a
s组成:

if s == "Z" * len(s):
    return "A" * (len(s) + 1)
如果您正在处理,那么您可能有(或应该有)函数来转换双射表示;只需将其转换为整数、递增,然后再转换回,就会容易得多:

def from_bijective(s, digits=string.ascii_uppercase):
    return sum(len(digits) ** i * (digits.index(c) + 1)
               for i, c in enumerate(reversed(s)))

def to_bijective(n, digits=string.ascii_uppercase):
    result = []
    while n > 0:
        n, mod = divmod(n - 1, len(digits))
        result += digits[mod]
    return ''.join(reversed(result))

def new_sku(s):
    return to_bijective(from_bijective(s) + 1)
结果

>>> rec('AAA')
'AAB'
>>> rec('AAZ')
'ABA'
>>> rec('ZZZ')
'AAAA'
>>> rec('AZA')
'AZB'

你必须想到“AAA”,“ZZZ”。。。作为您操纵的值的表示形式

首先,解析值:

val = sum(pow(26, i) * (ord(v) - ord('A') + 1) for i, v in enumerate(value[::-1]))
然后,为其增加价值:

val = val + 1
编辑 最终值由以下公式得出:

res = ""
while val > 0:
     val, n = divmod(val - 1, 26)
     res = chr(n+ord('A')) + res
零表示的缺失要求传递给divmod的值在每次循环时递减,我还没有找到列表理解的方法

编辑
可以使用
string.ascii\u uppercase.index()
string.ascii\u uppercase[]
而不是
ord()
chr()
,您可以使用
进行else
循环:

from string import ascii_uppercase as au

def solve(strs):
    lis = []
    for i, c in enumerate(strs[::-1], 1):
        ind = au.index(c) + 2
        lis.append(au[(ind%26)-1])
        if ind <= 26:
            break
    else:
        # This will execute only if the for-loop didn't break.
        lis.append('A')

    return strs[:-1*i] + "".join(lis[::-1])

print solve('AAA')
print solve('AAZ')
print solve('ZZZ')
print solve('AZZZ')
print solve('ZYZZ')
print solve('ZYYZZ')

您可以在此处使用一些递归:

def new_sku(s):
    s = s[::-1]
    new_s = ''
    return expand(s.upper(), new_s)[::-1]

import string
chars = string.ascii_uppercase

def expand(s, new_s, carry_forward=True):

    if not s:
        new_s += 'A' if carry_forward else ''
        return new_s

    new_s += chars[(ord(s[0]) - ord('A') + carry_forward) % 26]

    # Slice the first character, and expand rest of the string
    if s[0] == 'Z': 
        return expand(s[1:], new_s, carry_forward)
    else:
        return expand(s[1:], new_s, False)


print new_sku('AAB')
print new_sku('AAZ')
print new_sku('ZZZ')
print new_sku('aab')
print new_sku('aaz')
print new_sku('zzz')
输出:

AAC
ABA
AAAA
AAC
ABA
AAAA

这个怎么样?作为一种处理字符串变长的简单方法,您可以在前导“@”前面加上前缀,如果它没有递增,则将其去掉:

>>> def new_sku(s):
    def increment(s):
        if s.endswith('Z'):
            return increment(s[:-1])+'A'
        else:
            return s[:-1]+chr(ord(s[-1])+1)
    t = increment('@'+s)
    return t.lstrip('@')

>>> new_sku('AAA')
'AAB'
>>> new_sku('AAZ')
'ABA'
>>> new_sku('ZZZ')
'AAAA'

如果递归让您担心,那么您可以按之前的方式将其展平,但仍然使用添加和剥离的“@”字符。

我们可以看到总共有3个条件,您可以迭代字符串并处理其中一个条件。 您可以使用string.ascii_大写而不是chr和ord

import string
def add(s):
    s = list(s)[::-1]
    for index, char in enumerate(s):
        if char != "Z":
            s[index] = string.ascii_uppercase[string.ascii_uppercase.index(char) + 1]
            return s[::-1]
        elif char == "Z" and (index != len(s) - 1):
            s[index] = "A"
        elif char == "Z" and (index == len(s) - 1):
            s[index] = "A"
            return ["A"] + s[::-1]

只有一个建议-将幻数
65
声明为“const”,最好的方法是明确表示它是一个
ord('a')
您的
s
是否总是大写字母?您基本上是在实现base 26加法,当你的一个数字“26”变得更大时,你需要考虑如何执行。python
divmod
方法会有所帮助clever@AshwiniChaudhary:谢谢,我在最后一行中错放了-1是的,由于某种原因,没有表示0的字母这一事实是一个问题(由AAA+1=AAB表示)是时候拿到徽章了,或者也许你可以把它修好。@njzk2你对aza的期望是什么<代码>是azb吗?@njzk2 hay我用递归更新了我的代码,现在工作正常了。:-)@njzk2如果你想让它使用小写字母,只需使用
.upper()
ie
rec(s.upper())
@njzk2,给我否决票是不公平的。甚至我都以正确的方式更新了答案。@njzk2对不起:-)我现在已经开始投票了。。不管怎样,你解决了你的问题。我的复发解决方案是什么?@AshwiniChaudhary。现在正在努力缩短它。棒极了。但愿我早就想到了。
AAC
ABA
AAAA
AAC
ABA
AAAA
>>> def new_sku(s):
    def increment(s):
        if s.endswith('Z'):
            return increment(s[:-1])+'A'
        else:
            return s[:-1]+chr(ord(s[-1])+1)
    t = increment('@'+s)
    return t.lstrip('@')

>>> new_sku('AAA')
'AAB'
>>> new_sku('AAZ')
'ABA'
>>> new_sku('ZZZ')
'AAAA'
import string
def add(s):
    s = list(s)[::-1]
    for index, char in enumerate(s):
        if char != "Z":
            s[index] = string.ascii_uppercase[string.ascii_uppercase.index(char) + 1]
            return s[::-1]
        elif char == "Z" and (index != len(s) - 1):
            s[index] = "A"
        elif char == "Z" and (index == len(s) - 1):
            s[index] = "A"
            return ["A"] + s[::-1]