昨天在leetcode上做题,发现答案的解法特别简洁,特此记录下来,来感受一下python之美~
题目要求如下:
Given two lists A
and B
, and B
is an anagram of A
. B
is an anagram of A
means B
is made by randomizing the order of the elements in A
.
We want to find an index mapping P
, from A
to B
. A mapping P[i] = j
means the i
th element in A
appears in B
at index j
.
These lists A
and B
may contain duplicates. If there are multiple answers, output any of them.
For example, given
A = [12, 28, 46, 32, 50] B = [50, 12, 32, 46, 28]
We should return
[1, 4, 3, 2, 0]as
P[0] = 1
because the
0
th element of
A
appears at
B[1]
, and
P[1] = 4
because the
1
st element of
A
appears at
B[4]
, and so on.
Note:
A, B
have equal lengths in range[1, 100]
.A[i], B[i]
are integers in range[0, 10^5]
.
class Solution(object):
def anagramMappings(self, A, B):
D = {x: i for i, x in enumerate(B)}
return [D[x] for x in A]
做题时还在苦逼的写着for循环,看到答案的一刻发现自己真是有点弱,anyway,继续加油!
解释一下这个优美的地方,首先介绍一下enumerate(),他是python的内置函数,可以对一个可迭代的(iterable)或者可遍历的对象(如列表、字符串),将其组成一个索引序列,利用它可以同时获得索引和值,解法中将B变成了一个key:value的字典,然后把value和key对换组成一个新的字典D,return [D[x] for x in A]的意思是,如果新字典的value值在A中就返回其key值,就得到了A与B中元素的映射关系,真的很简洁。