我有两个数组(实际大小是10倍大):
$names = array(
'James',
'John',
'Robert',
'Michael',
'William'
);
$surnames = array(
'Smith',
'Johnson',
'Williams'
);
我需要生成人的全名。一个人只能有一个姓氏和一个姓氏。全名必须是唯一的!什么是最好的解决方案?
P.S。我不需要所有可能的名字。我认为当不能从给定的数组中创建任何其他唯一的全名时...我会抛出异常!
解决方案#1:
第一个出现在我脑海中的人......
创建一个名为full_names
的新数组,并在其中存储生成的名称。存储前,请检查是否已存在此值。随机生成。
这会太慢了!而且很愚蠢。
解决方案#2:
请求StackOverflow.com算法生成所有可能的全名......然后根据需要选择那么多。 不,这听起来也很愚蠢......
答案 0 :(得分:2)
创建一个(i,j)
整数双精度数组,涵盖所有可能的姓氏 - 姓氏组合。随机播放阵列。然后循环遍历数组,并逐一从中获取名称。
您将以随机顺序获得唯一的全名(前提是您的姓名和姓氏列表不包含重复项)。
修改强>
伪代码,按要求。
首先,执行以下设置步骤:
indexList = emptyList
for i = 1 to length(first_names)
for j = 1 to length(last_names)
indexList.push( (i,j) )
shuffle(indexList)
push
这里意味着在列表末尾添加一个元素。
现在每次需要一个新名称时,只需从indexList
取一个索引对,并从名称数组中返回相应的名称:
function getName()
(i, j) = indexList.pop()
return concatenate(first_names[i], " ", last_names[j])
pop
这里表示从列表末尾删除一个元素并将其返回。你不可能有这么多名字,indexList
应占用太多内存。
答案 1 :(得分:0)
循环显示名字和姓氏,检查您是否已生成该组合。在PHP中:
$full_names = array();
foreach ($names as $first_name) {
foreach ($surnames as $last_name) {
$candidate = $first_name . " " . $last_name;
if (!isset($full_names[$candidate])) {
$full_names[$candidate] = true;
}
}
}
print_r(array_keys($full_names));
在Python中也是如此:
print set([first + ' ' + last for first in names for last in surnames])