Skip to content

20027: 字符串问题

http://cs101.openjudge.cn/practice/20027

已知一个全是小写字母的字符串 a,现在想寻找一个与 a 长度相等的字符串 b,使得若按字典序排列,全是小写字母且长度与a相同的字符串恰好有 k 个排在 a 之后、b 之前。

输入

两行,第一行为字符串 a,第二行为正整数 k,数据保证此题有解

输出

要求的字符串b

样例输入

Sample1 Input:
a
1

Sample1 Output:
c

样例输出

Sample2 Input:
aaz
10

Sample2 Output:
abk

来源:cs101-2019 王楚惟

python
# 胡睿诚。用26进制数,比字符串好办
st = input()
l = len(st)
num = 0
for i in range(l):
    num += (26**i)*(ord(st[l-1-i])-97)
num += int(input())+1
ans = ''
while num:
    ans = chr(num%26+97)+ans
    num //= 26
print('a'*(l-len(ans))+ans)

下面给出一种 Python 解法,思路是将字符串看作 26 进制数字,然后令

b=a+(k+1)

python
def str_to_num(s):
    """将字符串s转换为对应的26进制数字(a->0, b->1, ...)"""
    num = 0
    for c in s:
        num = num * 26 + (ord(c) - ord('a'))
    return num

def num_to_str(num, length):
    """将数字num转换为固定长度length的26进制字符串"""
    s = ['a'] * length
    for i in range(length-1, -1, -1):
        s[i] = chr((num % 26) + ord('a'))
        num //= 26
    return "".join(s)

if __name__ == '__main__':
    a = input().strip()
    k = int(input().strip())
    num_a = str_to_num(a)
    num_b = num_a + (k + 1)  # a 与 b 之间正好有 k 个字符串
    b = num_to_str(num_b, len(a))
    print(b)
python
l = list(input())

k = int(input())
for _ in range(k+1):
    for j in range(len(l)-1, -1, -1):
        if l[j] < 'z':
            #l[j] += 1
            l[j] = chr(ord(l[j])+1)
            break
        else:
            l[j] = 'a'
    #print('k={},l={}'.format(k,l))
    
print(''.join(l))