Skip to content

Commit e94c71b

Browse files
committedMar 26, 2023
feat: add solutions to lc problem: No.1734
No.1734.Decode XORed Permutation
1 parent 6844d90 commit e94c71b

File tree

6 files changed

+93
-70
lines changed

6 files changed

+93
-70
lines changed
 

‎solution/1700-1799/1734.Decode XORed Permutation/README.md

+35-24
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,12 @@
4141

4242
<!-- 这里可写通用的实现逻辑 -->
4343

44+
**方法一:位运算**
45+
46+
我们注意到,数组 $perm$ 是前 $n$ 个正整数的排列,因此 $perm$ 的所有元素的异或和为 $1 \oplus 2 \oplus \cdots \oplus n$,记为 $a$。而 $encode[i]=perm[i] \oplus perm[i+1]$,如果我们将 $encode[0],encode[2],\cdots,encode[n-3]$ 的所有元素的异或和记为 $b$,则 $perm[n-1]=a \oplus b$。知道了 $perm$ 的最后一个元素,我们就可以通过逆序遍历数组 $encode$ 求出 $perm$ 的所有元素。
47+
48+
时间复杂度 $O(n)$,其中 $n$ 为数组 $perm$ 的长度。忽略答案数组的空间消耗,空间复杂度 $O(1)$。
49+
4450
<!-- tabs:start -->
4551

4652
### **Python3**
@@ -54,12 +60,13 @@ class Solution:
5460
a = b = 0
5561
for i in range(0, n - 1, 2):
5662
a ^= encoded[i]
57-
for i in range(n + 1):
63+
for i in range(1, n + 1):
5864
b ^= i
59-
ans = [a ^ b]
60-
for e in encoded[::-1]:
61-
ans.append(ans[-1] ^ e)
62-
return ans[::-1]
65+
perm = [0] * n
66+
perm[-1] = a ^ b
67+
for i in range(n - 2, -1, -1):
68+
perm[i] = encoded[i] ^ perm[i + 1]
69+
return perm
6370
```
6471

6572
### **Java**
@@ -68,23 +75,21 @@ class Solution:
6875

6976
```java
7077
class Solution {
71-
7278
public int[] decode(int[] encoded) {
7379
int n = encoded.length + 1;
74-
int[] ans = new int[n];
75-
int a = 0;
76-
int b = 0;
80+
int a = 0, b = 0;
7781
for (int i = 0; i < n - 1; i += 2) {
7882
a ^= encoded[i];
7983
}
80-
for (int i = 0; i < n + 1; ++i) {
84+
for (int i = 1; i <= n; ++i) {
8185
b ^= i;
8286
}
83-
ans[n - 1] = a ^ b;
87+
int[] perm = new int[n];
88+
perm[n - 1] = a ^ b;
8489
for (int i = n - 2; i >= 0; --i) {
85-
ans[i] = ans[i + 1] ^ encoded[i];
90+
perm[i] = encoded[i] ^ perm[i + 1];
8691
}
87-
return ans;
92+
return perm;
8893
}
8994
}
9095
```
@@ -96,13 +101,19 @@ class Solution {
96101
public:
97102
vector<int> decode(vector<int>& encoded) {
98103
int n = encoded.size() + 1;
99-
vector<int> ans(n);
100104
int a = 0, b = 0;
101-
for (int i = 0; i < n - 1; i += 2) a ^= encoded[i];
102-
for (int i = 0; i < n + 1; ++i) b ^= i;
103-
ans[n - 1] = a ^ b;
104-
for (int i = n - 2; i >= 0; --i) ans[i] = ans[i + 1] ^ encoded[i];
105-
return ans;
105+
for (int i = 0; i < n - 1; i += 2) {
106+
a ^= encoded[i];
107+
}
108+
for (int i = 1; i <= n; ++i) {
109+
b ^= i;
110+
}
111+
vector<int> perm(n);
112+
perm[n - 1] = a ^ b;
113+
for (int i = n - 2; ~i; --i) {
114+
perm[i] = encoded[i] ^ perm[i + 1];
115+
}
116+
return perm;
106117
}
107118
};
108119
```
@@ -112,19 +123,19 @@ public:
112123
```go
113124
func decode(encoded []int) []int {
114125
n := len(encoded) + 1
115-
ans := make([]int, n)
116126
a, b := 0, 0
117127
for i := 0; i < n-1; i += 2 {
118128
a ^= encoded[i]
119129
}
120-
for i := 0; i < n+1; i++ {
130+
for i := 1; i <= n; i++ {
121131
b ^= i
122132
}
123-
ans[n-1] = a ^ b
133+
perm := make([]int, n)
134+
perm[n-1] = a ^ b
124135
for i := n - 2; i >= 0; i-- {
125-
ans[i] = ans[i+1] ^ encoded[i]
136+
perm[i] = encoded[i] ^ perm[i+1]
126137
}
127-
return ans
138+
return perm
128139
}
129140
```
130141

‎solution/1700-1799/1734.Decode XORed Permutation/README_EN.md

+29-23
Original file line numberDiff line numberDiff line change
@@ -48,12 +48,13 @@ class Solution:
4848
a = b = 0
4949
for i in range(0, n - 1, 2):
5050
a ^= encoded[i]
51-
for i in range(n + 1):
51+
for i in range(1, n + 1):
5252
b ^= i
53-
ans = [a ^ b]
54-
for e in encoded[::-1]:
55-
ans.append(ans[-1] ^ e)
56-
return ans[::-1]
53+
perm = [0] * n
54+
perm[-1] = a ^ b
55+
for i in range(n - 2, -1, -1):
56+
perm[i] = encoded[i] ^ perm[i + 1]
57+
return perm
5758
```
5859

5960
### **Java**
@@ -62,20 +63,19 @@ class Solution:
6263
class Solution {
6364
public int[] decode(int[] encoded) {
6465
int n = encoded.length + 1;
65-
int[] ans = new int[n];
66-
int a = 0;
67-
int b = 0;
66+
int a = 0, b = 0;
6867
for (int i = 0; i < n - 1; i += 2) {
6968
a ^= encoded[i];
7069
}
71-
for (int i = 0; i < n + 1; ++i) {
70+
for (int i = 1; i <= n; ++i) {
7271
b ^= i;
7372
}
74-
ans[n - 1] = a ^ b;
73+
int[] perm = new int[n];
74+
perm[n - 1] = a ^ b;
7575
for (int i = n - 2; i >= 0; --i) {
76-
ans[i] = ans[i + 1] ^ encoded[i];
76+
perm[i] = encoded[i] ^ perm[i + 1];
7777
}
78-
return ans;
78+
return perm;
7979
}
8080
}
8181
```
@@ -87,13 +87,19 @@ class Solution {
8787
public:
8888
vector<int> decode(vector<int>& encoded) {
8989
int n = encoded.size() + 1;
90-
vector<int> ans(n);
9190
int a = 0, b = 0;
92-
for (int i = 0; i < n - 1; i += 2) a ^= encoded[i];
93-
for (int i = 0; i < n + 1; ++i) b ^= i;
94-
ans[n - 1] = a ^ b;
95-
for (int i = n - 2; i >= 0; --i) ans[i] = ans[i + 1] ^ encoded[i];
96-
return ans;
91+
for (int i = 0; i < n - 1; i += 2) {
92+
a ^= encoded[i];
93+
}
94+
for (int i = 1; i <= n; ++i) {
95+
b ^= i;
96+
}
97+
vector<int> perm(n);
98+
perm[n - 1] = a ^ b;
99+
for (int i = n - 2; ~i; --i) {
100+
perm[i] = encoded[i] ^ perm[i + 1];
101+
}
102+
return perm;
97103
}
98104
};
99105
```
@@ -103,19 +109,19 @@ public:
103109
```go
104110
func decode(encoded []int) []int {
105111
n := len(encoded) + 1
106-
ans := make([]int, n)
107112
a, b := 0, 0
108113
for i := 0; i < n-1; i += 2 {
109114
a ^= encoded[i]
110115
}
111-
for i := 0; i < n+1; i++ {
116+
for i := 1; i <= n; i++ {
112117
b ^= i
113118
}
114-
ans[n-1] = a ^ b
119+
perm := make([]int, n)
120+
perm[n-1] = a ^ b
115121
for i := n - 2; i >= 0; i-- {
116-
ans[i] = ans[i+1] ^ encoded[i]
122+
perm[i] = encoded[i] ^ perm[i+1]
117123
}
118-
return ans
124+
return perm
119125
}
120126
```
121127

‎solution/1700-1799/1734.Decode XORed Permutation/Solution.cpp

+12-6
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,18 @@ class Solution {
22
public:
33
vector<int> decode(vector<int>& encoded) {
44
int n = encoded.size() + 1;
5-
vector<int> ans(n);
65
int a = 0, b = 0;
7-
for (int i = 0; i < n - 1; i += 2) a ^= encoded[i];
8-
for (int i = 0; i < n + 1; ++i) b ^= i;
9-
ans[n - 1] = a ^ b;
10-
for (int i = n - 2; i >= 0; --i) ans[i] = ans[i + 1] ^ encoded[i];
11-
return ans;
6+
for (int i = 0; i < n - 1; i += 2) {
7+
a ^= encoded[i];
8+
}
9+
for (int i = 1; i <= n; ++i) {
10+
b ^= i;
11+
}
12+
vector<int> perm(n);
13+
perm[n - 1] = a ^ b;
14+
for (int i = n - 2; ~i; --i) {
15+
perm[i] = encoded[i] ^ perm[i + 1];
16+
}
17+
return perm;
1218
}
1319
};
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
func decode(encoded []int) []int {
22
n := len(encoded) + 1
3-
ans := make([]int, n)
43
a, b := 0, 0
54
for i := 0; i < n-1; i += 2 {
65
a ^= encoded[i]
76
}
8-
for i := 0; i < n+1; i++ {
7+
for i := 1; i <= n; i++ {
98
b ^= i
109
}
11-
ans[n-1] = a ^ b
10+
perm := make([]int, n)
11+
perm[n-1] = a ^ b
1212
for i := n - 2; i >= 0; i-- {
13-
ans[i] = ans[i+1] ^ encoded[i]
13+
perm[i] = encoded[i] ^ perm[i+1]
1414
}
15-
return ans
15+
return perm
1616
}
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,18 @@
11
class Solution {
22
public int[] decode(int[] encoded) {
33
int n = encoded.length + 1;
4-
int[] ans = new int[n];
5-
int a = 0;
6-
int b = 0;
4+
int a = 0, b = 0;
75
for (int i = 0; i < n - 1; i += 2) {
86
a ^= encoded[i];
97
}
10-
for (int i = 0; i < n + 1; ++i) {
8+
for (int i = 1; i <= n; ++i) {
119
b ^= i;
1210
}
13-
ans[n - 1] = a ^ b;
11+
int[] perm = new int[n];
12+
perm[n - 1] = a ^ b;
1413
for (int i = n - 2; i >= 0; --i) {
15-
ans[i] = ans[i + 1] ^ encoded[i];
14+
perm[i] = encoded[i] ^ perm[i + 1];
1615
}
17-
return ans;
16+
return perm;
1817
}
1918
}

‎solution/1700-1799/1734.Decode XORed Permutation/Solution.py

+6-5
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,10 @@ def decode(self, encoded: List[int]) -> List[int]:
44
a = b = 0
55
for i in range(0, n - 1, 2):
66
a ^= encoded[i]
7-
for i in range(n + 1):
7+
for i in range(1, n + 1):
88
b ^= i
9-
ans = [a ^ b]
10-
for e in encoded[::-1]:
11-
ans.append(ans[-1] ^ e)
12-
return ans[::-1]
9+
perm = [0] * n
10+
perm[-1] = a ^ b
11+
for i in range(n - 2, -1, -1):
12+
perm[i] = encoded[i] ^ perm[i + 1]
13+
return perm

0 commit comments

Comments
 (0)