(aa将是许多之一,bb将不会)
我以为会是10!/ 8!但显然我在做错事。任何人都可以帮我,因为我很沮丧。
(aa将是许多之一,bb将不会)
我以为会是10!/ 8!但显然我在做错事。任何人都可以帮我,因为我很沮丧。
Answers:
您有6个不同的字母:a,b,c,d,e,f,其中您可以生成6 x 5 = 30个带有两个不同字母的单词。此外,您可以使用相同的字母两次生成3个单词aa,cc,dd。因此,单词总数为30 + 3 = 33。
Zahava方法的替代方法:有种方式将两个字母af配对。但是,也有不2b中,e或f的字符,所以“BB”,“EE”和“FF”是不可能的,使得字的数量 36 - 3 = 33。
您尝试解决该问题的方式似乎忽略了以下事实:没有10个不同的字母。如果您有10个不同的字母,那么您的答案将是正确的。
如果您不能以“聪明”的方式进行推理,那么通常值得尝试一下蛮力。想象一下,尝试写下您可以按字母顺序排列的所有单词的列表。
有多少可以以“ A”开头?那么“ A”后面可以跟着A,B,C,D,E或F,所以这是六种方式。
多少可以用“ B”开头?紧随其后的是A,C,D,E或F,这只有五种方式,因为没有第二个“ B”。
有多少可以以“ C”开头?由于“ C”在您的列表中出现了3次,因此它可以跟在其后,也可以跟在其他五个字母中的任何一个后面,因此与“ A”一样,也有6种方式。请注意,我们无法获得任何“额外”方式,仅仅是因为“ C”出现的次数比“ A”多次;除了第二次露面,任何事情都是多余的。
希望现在可以清楚地看到,列表中仅出现一次的每个字母都可以出现在五个单词的开头,出现两次或更多次的字母可以出现在六个单词的开头。仅出现一次的字母是“ B”,“ E”和“ F”,每个字母可以在五个单词的开头,因此等于5 + 5 + 5 = 15个单词。出现两次或两次以上的字母是“ A”,“ C”和“ D”,每个字母可以在六个单词的开头,因此等于6 + 6 + 6 = 18个单词。总共有15 + 18 = 33个字。
这比其他方法更复杂,但是通过尝试以这种系统的方式思考答案,您可能已经能够“发现”一种更快的方法。
请注意,如果这已被表述为概率问题,则您的第一个倾向可能是绘制树形图。第一个字母从六个分支开始,但是第二个字母从“ A”,“ C”和“ D”出现六个分支(因为可以跟随六个字母中的任何一个)但是只有五个分支来自“ B”,“ E”和“ F”(因为它们自己不能跟随它们)。这种分支模式实际上与我的回答相同,但是您可能更希望从树上更直观地考虑它。
从数学角度来看,解决方案是列表和其自身之间的直角乘积元素元素(一旦删除对角线)。您可以使用以下算法解决此问题:
集合是定义明确的不同对象的集合,因此不会重复对象。
from itertools import product
import numpy as np
letters = list("aabcccddef")
cartesianproduct = np.array(["".join(i) for i in product(letters,letters)]).reshape(10,10)
cartesianproduct
Out :
array([['aa', 'aa', 'ab', 'ac', 'ac', 'ac', 'ad', 'ad', 'ae', 'af'],
['aa', 'aa', 'ab', 'ac', 'ac', 'ac', 'ad', 'ad', 'ae', 'af'],
['ba', 'ba', 'bb', 'bc', 'bc', 'bc', 'bd', 'bd', 'be', 'bf'],
['ca', 'ca', 'cb', 'cc', 'cc', 'cc', 'cd', 'cd', 'ce', 'cf'],
['ca', 'ca', 'cb', 'cc', 'cc', 'cc', 'cd', 'cd', 'ce', 'cf'],
['ca', 'ca', 'cb', 'cc', 'cc', 'cc', 'cd', 'cd', 'ce', 'cf'],
['da', 'da', 'db', 'dc', 'dc', 'dc', 'dd', 'dd', 'de', 'df'],
['da', 'da', 'db', 'dc', 'dc', 'dc', 'dd', 'dd', 'de', 'df'],
['ea', 'ea', 'eb', 'ec', 'ec', 'ec', 'ed', 'ed', 'ee', 'ef'],
['fa', 'fa', 'fb', 'fc', 'fc', 'fc', 'fd', 'fd', 'fe', 'ff']],
dtype='|S2')
我们去掉对角线
diagremv = np.array([ np.delete(arr,index) for index,arr in enumerate(cartesianproduct)])
diagremv
array([['aa', 'ab', 'ac', 'ac', 'ac', 'ad', 'ad', 'ae', 'af'],
['aa', 'ab', 'ac', 'ac', 'ac', 'ad', 'ad', 'ae', 'af'],
['ba', 'ba', 'bc', 'bc', 'bc', 'bd', 'bd', 'be', 'bf'],
['ca', 'ca', 'cb', 'cc', 'cc', 'cd', 'cd', 'ce', 'cf'],
['ca', 'ca', 'cb', 'cc', 'cc', 'cd', 'cd', 'ce', 'cf'],
['ca', 'ca', 'cb', 'cc', 'cc', 'cd', 'cd', 'ce', 'cf'],
['da', 'da', 'db', 'dc', 'dc', 'dc', 'dd', 'de', 'df'],
['da', 'da', 'db', 'dc', 'dc', 'dc', 'dd', 'de', 'df'],
['ea', 'ea', 'eb', 'ec', 'ec', 'ec', 'ed', 'ed', 'ef'],
['fa', 'fa', 'fb', 'fc', 'fc', 'fc', 'fd', 'fd', 'fe']],
dtype='|S2')
我们计算元素集的长度:
len(set(list(diagremv.flatten())))
Out: 33
不用蛮力计数的另一种方法是:
如果第一个字母是a,c或d,则第二个字母有6个不同的剩余选择。
但是,如果第一个字母是b,e或f,则第二个字母只有5个不同的剩余选择。
所以有 区分两个字母词。
我对这个问题的回答:从aabcccddef可以得到多少个2个字母的单词
* //问题的重点是“单词”而不是成对的组合。使用单词时,该字母必须出现两次才能多次使用该单词,例如,字母“ a”中有两个,字母“ d”中有两个,因此有可能将“ ad”写成一个单词两次。
[self-study]
标签并阅读其wiki。