1 字符串中所有重排(10分)

题目内容:

给定一个字符串s与待查找字符串p,请给出使得s[i:i+len(p)]是p的一个字母重排的所有下标i

题目保证字符串p非空

输入格式:

两行字符串,第一行为s,第二行为p

输出格式:

所有满足条件的下标从小到大排列,以空格分隔输出

若无对应下标,则输出"none"

输入样例:

cbaebabacd

abc

输出样例:

0 6

解题思路:

将待查找字符串p和s[i:i+len(p)]排序后依次比对

程序代码:

def findAnagrams(s, p):
    p_rank = sorted(p)
    sub = []
    for i in range(len(s)-len(p)+1):
        s_rank = sorted(s[i:i+len(p)])
        if p_rank == s_rank:
            sub.append(i)
    if sub == []:
        print('none')
    else:
        print(' '.join([str(i) for i in sub]))


s = [i for i in input()]
p = [i for i in input()]
findAnagrams(s, p)

2 列表出现最频繁的元素(10分)

题目内容:

给定一个列表与数字K,按出现次数倒序输出列表中前K个出现最频繁的元素;若少于K个元素则返回所有元素

输入格式:

输入为两行

第一行为给定列表,以合法的Python表达式给出

第二行为数字K

输出格式:

不多于K个数字,以空格分隔

输入样例:

[1,1,1,2,2,3]

2

输出样例:

1 2

解题思路:

要注意频率相同的情况,出现频率相同时按元素大小升序排序

程序代码:

def topKFrequent(nums, k):
    dict = {}
    for i in set(nums):
        dict[i] = nums.count(i)
    tuple = sorted(dict.items(), key=lambda x: (x[1],-x[0]), reverse=True) # 按值降序排序,在值相等的情况下再按键升序排序
    result = []
    if len(tuple) < k:
        for i in range(len(tuple)):
            result.append(tuple[i][0])
        print(' '.join([str(i) for i in result]))
    else:
        for i in range(k):
            result.append(tuple[i][0])
        print(*result)


lst = eval(input())
k = int(input())
topKFrequent(lst, k)

3 散列表(10分)

题目内容:

给定一个指定大小N的散列表,并输入一系列数字:若找到空槽,则插入该数字,并返回槽位置;若该数字在散列表中存在,则直接输出其位置。

注:使用下标增加的二次探测法解决散列冲突

注2:散列表实际大小应确定为不小于用户输入N的最小质数

输入格式:

两行

第一行为用户指定散列表大小N

第二行为一系列数字,以空格分隔

输出格式:

逐个输出对应数字在散列表中位置,以空格分隔

若该数字无法插入,则输出“-”

输入样例:

4

10 6 4 10 15

输出样例:

0 1 4 0 -

解题思路:

二次探测法是指当前key与之前的key产生散列冲突时,则当前key存在该地址后偏移量为(1,2,3…)的二次方地址处。

程序代码:

def createHashTable(n):
    if n <= 2:
        return [None] * 2
    for i in range(2, n):
        if n % i == 0:
            n += 1
    else:
        return [None] * n


def insertNumbers(table, nums):
    lenth = len(table)
    result = []
    for i in nums:
        hashValue = i % lenth
        if i in table:
            result.append(table.index(i))
        elif table[hashValue] == None:
            table[hashValue] = i
            result.append(hashValue)
        else:
            for j in range(1, lenth):
                hashValue = (i + j * j) % lenth
                if table[hashValue] == None:
                    table[hashValue] = i
                    result.append(hashValue)
                    break
            else:
                result.append('-')

    print(*result)


n = int(input())
nums = list(map(int, input().split()))
table = createHashTable(n)
insertNumbers(table, nums)