0
点赞
收藏
分享

微信扫一扫

牛客网刷题

1. 单词接龙

单词接龙的规则是:

可用于接龙的单词首字母必须要前一个单词的尾字母相同;
当存在多个首字母相同的单词时,取长度最长的单词,如果长度也相等,则取字典序最小的单词;已经参与接龙的单词不能重复使用。
现给定一组全部由小写字母组成单词数组,并指定其中的一个单词作为起始单词,进行单词接龙,
请输出最长的单词串,单词串是单词拼接而成,中间没有空格。
输入描述:

输入的第一行为一个非负整数,表示起始单词在数组中的索引K,0 <= K < N ;
输入的第二行为一个非负整数,表示单词的个数N;
接下来的N行,分别表示单词数组中的单词。
输出描述:

输出一个字符串,表示最终拼接的单词串。
示例1  输入输出示例仅供调试,后台判题数据一般不包含示例

输入

0

6

word

dd

da

dc

dword

d

输出

worddwordda

说明

先确定起始单词word,再接以d开头的且长度最长的单词dword,剩余以d开头且长度最长的有dd、da、dc,则取字典序最小的da,所以最后输出worddwordda。

示例2  输入输出示例仅供调试,后台判题数据一般不包含示例

输入

4

6

word

dd

da

dc

dword

d

输出

dwordda

说明

先确定起始单词dword,剩余以d开头且长度最长的有dd、da、dc,则取字典序最小的da,所以最后输出dwordda。
备注:

单词个数N的取值范围为[1, 20];
单个单词的长度的取值范围为[1, 30];

题解:

index = int(input())
num = int(input())

word_list = []
while num:
    s = input()
    word_list.append(s)
    num -= 1

start = word_list.pop(index)

def ff(end, _word_list):
    """寻找合适的单词,并将其从 word_list 中 pop 掉"""
    temp = []  # [(2, 'dd'), (2, 'db'), (2, 'da')]
    for i in _word_list:
        if end == i[0]:
            temp.append((len(i), i))

    if temp:
        temp = sorted(temp, key=lambda x: x[0], reverse=True)  # 从大到小排列
        temp_2 = [temp[0][1]]
        for j in temp[1:]:
            if j[0] == temp[0][0]:
                temp_2.append(j[1])

        temp_2.sort()
        word = temp_2.pop(0)
        word_list.remove(word)
        return word
    else:
        return ""

result = ff(start[-1], word_list)
start += result

while result:
    result = ff(result[-1], word_list)
    start += result

print(start)

2. 字符串加密

给你一串未加密的字符串str,通过对字符串的每一个字母进行改变来实现加密,加密方式是在每一个字母str[i]偏移特定数组元素a[i]的量,数组a前三位已经赋值:a[0]=1,a[1]=2,a[2]=4。

当i>=3时,数组元素a[i]=a[i-1]+a[i-2]+a[i-3]。

例如:原文 abcde 加密后 bdgkr,其中偏移量分别是1,2,4,7,13。

输入描述:

第一行为一个整数n(1<=n<=1000),表示有n组测试数据,每组数据包含一行,原文str(只含有小写字母,0<长度<=50)。

输出描述:

每组测试数据输出一行,表示字符串的密文。

示例1  输入输出示例仅供调试,后台判题数据一般不包含示例

输入

1

xy

输出

ya

说明

第一个字符x偏移量是1,即为y,第二个字符y偏移量是2,即为a。

题解:

n = int(input())

dp = [0] * 50
dp[0] = 1
dp[1] = 2
dp[2] = 4

def ff(num, char):  
    ascii_index = ord(char)  # 在 ascii 中的位置   
    a = num + ascii_index       
    if 97 <= a <= 122:
        next_char = chr(a)
    else:
        next_char = chr(97 + (a - 97) % 26)

    return next_char

def f1(length):
    for i in range(3, length + 1):
        dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3]

    return dp[length - 1]

for i in range(n):
    s = input()

    res = ""
    for index in range(len(s)):
        char = s[index]

        if index == 0:
            res += ff(1, char)
        elif index == 1:
            res += ff(2, char)
        elif index == 2:
            res += ff(4, char)
        else:
            num = f1(index)
            res += ff(num, char)

    print(res)
举报

相关推荐

0 条评论