最佳人选 问题描述
某特种部队采用了一套性格密码机制来筛选执行特定任务的最佳士兵,该机制的规则如下:
每个人的性格可以通过 M 个维度来描述,每个维度分为 A, B, C, D, E 五种类型。 同一维度内,字母距离越近,性格类型差异越小,匹配程度越高。比如,A 和 B 的差异为 1,A 和 D 的差异为 3。 其中 AE、BD、CE、BE 为不相容性格类型,差异值设为无穷大(无法匹配)。 如果某一维度存在不相容性格类型,则表示两个士兵性格完全不匹配。 对于符合匹配条件的士兵,差异值总和越小表示匹配程度越高。 现在,有一个重要的机密任务,要求找到最匹配该任务所需性格密码的士兵。你需要编写一个算法,帮助部队找到符合条件的最佳人选。
m 表示性格密码的维度。 n 表示备选特种兵的数量。 target 是代表任务的性格密码。 array 是一个包含 n 个元素的列表,每个元素为 M 位的性格密码。 测试样例 样例1:
输入:m = 6, n = 3, target = "ABCDEA", array = ["AAAAAA", "BBBBBB", "ABDDEB"] 输出:'ABDDEB'
样例2:
输入:m = 5, n = 4, target = "ABCED", array = ["ABCDE", "BCDEA", "ABDCE", "EDCBA"] 输出:'ABCDE'
样例3:
输入:m = 4, n = 4, target = "AEBC", array = ["ACDC", "BBDC", "EBCB", "BBBB"] 输出:'None'
import sys # 导入sys模块
def solution(m, n, target, array):
incompatible_elements = ['AE','BD','CE','BE',
'EA','DB','EC','EB',]
# 不相容的创建列表
difference = sys.maxsize # 初始化为2^63-1
for j in range(n):
# 对每个备选士兵进行遍历
temp_difference = 0 # 临时差值 每个士兵的临时差值都是重新搞的
whether_incompatible = False # 是否有不兼容的元素 初始为没有
for i in range(m):
# 每个维度分别比较
if (array[j][i] + target[i]) not in incompatible_elements:
# 如果没在不兼容元素中
temp_difference += abs(ord(array[j][i]) - ord(target[i]))
# ASCII码相减 取绝对值 并加到临时差值中
else:
whether_incompatible = True
break
if temp_difference < difference and whether_incompatible == False:
difference = temp_difference # 更新最小差异值
result = array[j] # 更新答案
elif temp_difference == difference and whether_incompatible == False:
result = result + ' ' + array[j] # 合适的人选有两个
return result if difference!= sys.maxsize else "None"
if __name__ == "__main__":
# Add your test cases here
matrix = [
"AAAAAA", "BBBBBB", "ABDDEB"
]
print(solution(6, 3, "ABCDEA", matrix) == "ABDDEB")
ord()
ord() 是 Python 中的一个内置函数,用于返回字符的 Unicode 编码(整数表示)。
语法:
ord(char)
参数:
char:一个字符(长度为1的字符串)。
返回值:
- 返回该字符对应的 Unicode 编码(整数)。
示例:
# 示例 1: 获取字符的 Unicode 编码
char = 'A'
print(ord(char)) # 输出: 65
# 示例 2: 获取其他字符的 Unicode 编码
char = 'a'
print(ord(char)) # 输出: 97
char = '中'
print(ord(char)) # 输出: 20013
解释:
ord('A')返回 65,因为字母'A'的 Unicode 编码是 65。ord('a')返回 97,因为字母'a'的 Unicode 编码是 97。ord('中')返回 20013,因为汉字'中'的 Unicode 编码是 20013。
注意:
ord()只接受单个字符作为参数。如果传入长度大于1的字符串,会抛出TypeError异常。
# 错误用法,传入多个字符
print(ord('AB')) # 会抛出 TypeError: ord() expected a character, but string of length 2 found
ord() 和它的逆操作 chr() 常常一起使用。chr() 是将一个整数转换为对应的字符。例如,chr(65) 会返回 'A'。
1. 为什么需要 Unicode 编码?
在早期的计算机中,每个字符(字母、数字、符号等)都有一个对应的数字,用来在计算机中表示该字符。最早的标准是 ASCII 编码,它为 128 个字符(如英文字母、数字、标点符号等)分配了数字。这对于英语的使用没有问题,但当计算机开始处理其他语言时,问题就出现了。
例如,中文字符“中”和“文”在 ASCII 中并没有对应的数字,导致不同语言的字符不能统一在计算机中处理。
为了支持全球所有的字符,包括中文、阿拉伯文、日文、表情符号等等,就需要一个 全球统一的编码标准。这就是 Unicode。
2. Unicode 是什么?
Unicode 是一个 字符集,它为几乎所有语言的字符分配了唯一的数字标识。这个数字标识叫做 代码点。例如:
- 英文字母
'A'的 Unicode 代码点是U+0041 - 中文字符
'中'的 Unicode 代码点是U+4E2D - 表情符号 😀 的 Unicode 代码点是
U+1F600
通过 Unicode 编码,计算机能够处理全球各种语言的字符,而不用担心不同编码标准之间的冲突。
3. 代码点(Code Point)
每个 Unicode 字符都有一个独一无二的 代码点。代码点是一个数字(通常以十六进制表示),用来唯一标识字符。例如:
'A'的代码点是U+0041。'中'的代码点是U+4E2D。'😀'的代码点是U+1F600。
代码点只是字符的数字标识,它并不是字符的存储方式,存储字符的具体方式有很多种。
4. Unicode 编码方式
为了在计算机中存储和传输字符,Unicode 定义了几种 编码方式,每种编码方式都有不同的存储大小和效率:
- UTF-8:一种变长编码,可以用 1 到 4 个字节来表示一个字符。它最常用于网页和文件存储,因为它对英文字符特别节省空间,同时支持全球所有语言。
- UTF-16:每个字符使用 2 或 4 个字节。它适用于需要大量支持多语言的应用。
- UTF-32:每个字符都使用 4 个字节,比较占空间,但它使得编码方式更加简单。
5. Python 中如何使用 Unicode?
在 Python 中,每个字符串本质上就是 Unicode 字符。你可以用 ord() 函数获取字符的 Unicode 代码点,或者用 chr() 函数将代码点转换回字符。
例子:
# 获取字符的 Unicode 代码点
print(ord('A')) # 输出 65,即 'A' 对应的 Unicode 代码点
print(ord('中')) # 输出 20013,即 '中' 对应的 Unicode 代码点
# 获取 Unicode 代码点对应的字符
print(chr(65)) # 输出 'A'
print(chr(20013)) # 输出 '中'
6. 为什么 Unicode ?
- Unicode 可以支持世界上几乎所有语言的字符,包括汉字、拉丁字母、阿拉伯字母等。
- 无论是用中文、英文,还是其他语言,Unicode 都能保证字符在不同设备和系统中的统一表示。
- 随着新的字符的加入,Unicode 可以继续扩展,确保它能够处理新出现的字符和符号(例如表情符号)。
7. 举个例子
假设你要去不同国家旅行,每个国家使用不同的语言和文字。你会需要一本 多国语言词典,这样就可以用统一的方式理解和翻译各种语言。Unicode 就像这本词典,它为所有字符提供了一个统一的数字表示,让计算机能够理解和处理世界上各种语言的字符。
- Unicode 是一个字符集,为全球几乎所有的字符提供唯一的数字标识(代码点)。
- 通过 Unicode,我们可以统一处理不同语言和符号(如汉字、拉丁字母、表情符号等)。
- 编码方式(如 UTF-8、UTF-16)是将这些数字标识转换为计算机能存储和传输的字节序列。
- 这使得计算机能够跨越语言、平台和地域的障碍,统一处理和显示文本。