Description

你是一位矿主,收集了一批石头,这批石头中有宝石也有普通的石头,给定一个宝石的列表,计算这批石头中的宝石数目。要求使用size不超过10的hash表来完成此项任务。特殊字符(!@#$%^&*)和字母均可使用唯一的ascii码表示,请同学们查阅ascii码的原理,表示方式以及与int类型的相互转换方式。使用线性探测法解决冲突。

Input 分别输入两行string数据。第一行数据是宝石的种类(第一行数据不会重复),第二行数据是你所拥有的所有石头。PS:注意区分大小写,大写和小写代表不同种类的宝石。

Output 宝石数量M。

Sample Input 1

bKA bBBBaAAKKzzmmkkk Sample Output 1

5 Sample Input 2

KL@ kkll&&&&OKMMMMML@ Sample Output 2

3

由于本题比较简单,不多说,可参考我另外一篇相关文章 哈希应用—求同一条直线上的点的数量 转化为ascii用ord函数即可

Coding:

from typing import List, Any

class HashTable(object):
    def __init__(self, size: object = 10) -> object:
        self.size = size
        self._table = [[None, -1]] * size

    def find_key(self, key):
        index = key % self.size
        while self._table[index][0] is not None and key != self._table[index][0]:
            index = (index + 1) % self.size
        return index

    def append(self, key):
        index = self.find_key(key)
        if index is not None:
            self._table[index] = [key, self._table[index][1] + 1]
            return True
        else:
            return False

    def check_key(self, key):
        for j, item in enumerate(self._table):
            if item[0] is not None and item[0] == key:
                item[1] += 1
                return True
        return False

h = HashTable()
count = 0
n = list(map(ord, input()))
for i in range(len(n)):
    h.append(n[i])
m = list(map(ord, input()))
for i in range(len(m)):
    if h.check_key(m[i]):
        count += 1
print(count)