1720. 解码异或后的数组
这是一道位运算的简单题,后边有此题升级版的中等题目
其实,知道一些基本知识后,此题是很简单的。
- 异或满足交换律
- 异或满足:a ^ b = c 可知 a ^ c = b
- a ^ 0 = a
- a ^ a = 0
这道题给出了加密后的数组,同时也给出了原数组的第一个值,利用上边的第二个知识,问题就迎刃而解了。
将加密数组的第一个元素和原数组的第一个元素异或就得到原数组第二个元素…根据题目,就这样推下去答案就出来了。
class Solution:
def decode(self, encoded: List[int], first: int) -> List[int]:
ans = [first,]
for i in encoded:
ans.append(ans[-1]^i)
return ans
1734. 解码异或后的排列
这道题主要问题集中在如何寻找第一个值,一旦找出来,其实和上面的题没差了。确实偷瞄到了题解,还看得懵了一段时间。借此以简单的形式记录一下
如
果
原
数
组
a
n
s
=
[
a
,
b
,
c
,
d
,
e
,
f
]
(
n
偶
数
)
则
e
n
c
o
d
e
d
=
[
a
b
,
b
c
,
c
d
,
d
e
,
e
f
]
a
b
表
示
a
与
b
异
或
运
算
我
们
能
够
知
道
得
是
原
数
组
是
不
大
于
n
的
正
整
数
排
列
,
n
是
奇
数
,
这
给
得
神
奇
。
偷
看
了
一
下
题
解
,
利
用
一
种
整
体
的
思
想
去
反
求
,
第
一
个
元
素
需
要
的
就
是
奇
数
。
a
n
s
内
部
异
或
运
算
,
得
到
的
是
a
b
c
d
e
f
,
在
已
知
的
数
组
中
没
有
单
独
的
f
让
我
们
能
够
反
求
a
.
a
=
a
b
c
d
e
f
异
或
b
c
异
或
d
e
异
或
f
,
这
里
多
一
个
f
为
什
么
这
么
说
?
⇒
在
e
n
c
o
d
e
d
中
能
够
找
到
的
是
两
两
异
或
的
结
果
,
能
从
其
中
下
标
为
奇
数
的
元
素
提
出
来
,
反
求
得
a
,
但
是
没
有
单
独
的
f
。
如果原数组 ans = [a, b, c, d, e, f](n偶数) \\则encoded = [ab,bc,cd,de,ef]\ \ \ \ ab表示a与b异或运算\\我们能够知道得是原数组是不大于n的正整数排列,n是奇数,这给得神奇。\\偷看了一下题解,利用一种整体的思想去反求,第一个元素需要的就是奇数。\\ans内部异或运算,得到的是abcdef,在已知的数组中没有单独的f让我们能够反求a.\\a = abcdef异或bc异或de异或f,这里多一个f\\为什么这么说?\Rightarrow 在encoded中能够找到的是两两异或的结果,能从其中下标为奇数的元素提出来,反求得a,但是没有单独的f。
如果原数组ans=[a,b,c,d,e,f](n偶数)则encoded=[ab,bc,cd,de,ef] ab表示a与b异或运算我们能够知道得是原数组是不大于n的正整数排列,n是奇数,这给得神奇。偷看了一下题解,利用一种整体的思想去反求,第一个元素需要的就是奇数。ans内部异或运算,得到的是abcdef,在已知的数组中没有单独的f让我们能够反求a.a=abcdef异或bc异或de异或f,这里多一个f为什么这么说?⇒在encoded中能够找到的是两两异或的结果,能从其中下标为奇数的元素提出来,反求得a,但是没有单独的f。
class Solution:
def decode(self, encoded: List[int]) -> List[int]:
m = len(encoded)
n = reduce(lambda x,y: x^y,range(1,m+2)) # 求abcde
to_find = 0
for x in range(m):
if x % 2:
to_find ^= encoded[x] # 求bcde
first = n ^ to_find # 求a
ans = [first]
for i in encoded: # 同第一题
ans.append(ans[-1]^i)
return ans