Skip to content

Commit 69c4702

Browse files
authored
feat: add solutions to lc problem: No.0880 (doocs#2014)
No.0880.Decoded String at Index
1 parent 623b53d commit 69c4702

File tree

7 files changed

+361
-2
lines changed

7 files changed

+361
-2
lines changed

solution/0800-0899/0880.Decoded String at Index/README.md

Lines changed: 127 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,22 +59,148 @@
5959

6060
<!-- 这里可写通用的实现逻辑 -->
6161

62+
**方法一:逆向思维**
63+
64+
我们可以先计算出解码字符串的总长度 $m$,然后从后向前遍历字符串,每次更新 $k$ 为 $k \bmod m$,直到 $k$ 为 $0$ 且当前字符为字母,返回当前字符。否则,如果当前字符为数字,则将 $m$ 除以该数字。如果当前字符为字母,则将 $m$ 减 $1$。
65+
66+
时间复杂度 $O(n)$,其中 $n$ 为字符串的长度。空间复杂度 $O(1)$。
67+
6268
<!-- tabs:start -->
6369

6470
### **Python3**
6571

6672
<!-- 这里可写当前语言的特殊实现逻辑 -->
6773

6874
```python
69-
75+
class Solution:
76+
def decodeAtIndex(self, s: str, k: int) -> str:
77+
m = 0
78+
for c in s:
79+
if c.isdigit():
80+
m *= int(c)
81+
else:
82+
m += 1
83+
for c in s[::-1]:
84+
k %= m
85+
if k == 0 and c.isalpha():
86+
return c
87+
if c.isdigit():
88+
m //= int(c)
89+
else:
90+
m -= 1
7091
```
7192

7293
### **Java**
7394

7495
<!-- 这里可写当前语言的特殊实现逻辑 -->
7596

7697
```java
98+
class Solution {
99+
public String decodeAtIndex(String s, int k) {
100+
long m = 0;
101+
for (int i = 0; i < s.length(); ++i) {
102+
if (Character.isDigit(s.charAt(i))) {
103+
m *= (s.charAt(i) - '0');
104+
} else {
105+
++m;
106+
}
107+
}
108+
for (int i = s.length() - 1;; --i) {
109+
k %= m;
110+
if (k == 0 && !Character.isDigit(s.charAt(i))) {
111+
return String.valueOf(s.charAt(i));
112+
}
113+
if (Character.isDigit(s.charAt(i))) {
114+
m /= (s.charAt(i) - '0');
115+
} else {
116+
--m;
117+
}
118+
}
119+
}
120+
}
121+
```
122+
123+
### **C++**
124+
125+
```cpp
126+
class Solution {
127+
public:
128+
string decodeAtIndex(string s, int k) {
129+
long long m = 0;
130+
for (char& c : s) {
131+
if (isdigit(c)) {
132+
m *= (c - '0');
133+
} else {
134+
++m;
135+
}
136+
}
137+
for (int i = s.size() - 1;; --i) {
138+
k %= m;
139+
if (k == 0 && isalpha(s[i])) {
140+
return string(1, s[i]);
141+
}
142+
if (isdigit(s[i])) {
143+
m /= (s[i] - '0');
144+
} else {
145+
--m;
146+
}
147+
}
148+
}
149+
};
150+
```
151+
152+
### **Go**
153+
154+
```go
155+
func decodeAtIndex(s string, k int) string {
156+
m := 0
157+
for _, c := range s {
158+
if c >= '0' && c <= '9' {
159+
m *= int(c - '0')
160+
} else {
161+
m++
162+
}
163+
}
164+
for i := len(s) - 1; ; i-- {
165+
k %= m
166+
if k == 0 && s[i] >= 'a' && s[i] <= 'z' {
167+
return string(s[i])
168+
}
169+
if s[i] >= '0' && s[i] <= '9' {
170+
m /= int(s[i] - '0')
171+
} else {
172+
m--
173+
}
174+
}
175+
}
176+
```
77177

178+
### **TypeScript**
179+
180+
```ts
181+
function decodeAtIndex(s: string, k: number): string {
182+
let m = 0n;
183+
for (const c of s) {
184+
if (c >= '1' && c <= '9') {
185+
m *= BigInt(c);
186+
} else {
187+
++m;
188+
}
189+
}
190+
for (let i = s.length - 1; ; --i) {
191+
if (k >= m) {
192+
k %= Number(m);
193+
}
194+
if (k === 0 && s[i] >= 'a' && s[i] <= 'z') {
195+
return s[i];
196+
}
197+
if (s[i] >= '1' && s[i] <= '9') {
198+
m = (m / BigInt(s[i])) | 0n;
199+
} else {
200+
--m;
201+
}
202+
}
203+
}
78204
```
79205

80206
### **...**

solution/0800-0899/0880.Decoded String at Index/README_EN.md

Lines changed: 127 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,18 +55,144 @@ The 1<sup>st</sup> letter is &quot;a&quot;.
5555

5656
## Solutions
5757

58+
**Solution 1: Reverse Thinking**
59+
60+
We can first calculate the total length $m$ of the decoded string, then traverse the string from back to front. Each time, we update $k$ to be $k \bmod m$, until $k$ is $0$ and the current character is a letter, then we return the current character. Otherwise, if the current character is a number, we divide $m$ by this number. If the current character is a letter, we subtract $1$ from $m$.
61+
62+
The time complexity is $O(n)$, where $n$ is the length of the string. The space complexity is $O(1)$.
63+
5864
<!-- tabs:start -->
5965

6066
### **Python3**
6167

6268
```python
63-
69+
class Solution:
70+
def decodeAtIndex(self, s: str, k: int) -> str:
71+
m = 0
72+
for c in s:
73+
if c.isdigit():
74+
m *= int(c)
75+
else:
76+
m += 1
77+
for c in s[::-1]:
78+
k %= m
79+
if k == 0 and c.isalpha():
80+
return c
81+
if c.isdigit():
82+
m //= int(c)
83+
else:
84+
m -= 1
6485
```
6586

6687
### **Java**
6788

6889
```java
90+
class Solution {
91+
public String decodeAtIndex(String s, int k) {
92+
long m = 0;
93+
for (int i = 0; i < s.length(); ++i) {
94+
if (Character.isDigit(s.charAt(i))) {
95+
m *= (s.charAt(i) - '0');
96+
} else {
97+
++m;
98+
}
99+
}
100+
for (int i = s.length() - 1;; --i) {
101+
k %= m;
102+
if (k == 0 && !Character.isDigit(s.charAt(i))) {
103+
return String.valueOf(s.charAt(i));
104+
}
105+
if (Character.isDigit(s.charAt(i))) {
106+
m /= (s.charAt(i) - '0');
107+
} else {
108+
--m;
109+
}
110+
}
111+
}
112+
}
113+
```
114+
115+
### **C++**
116+
117+
```cpp
118+
class Solution {
119+
public:
120+
string decodeAtIndex(string s, int k) {
121+
long long m = 0;
122+
for (char& c : s) {
123+
if (isdigit(c)) {
124+
m *= (c - '0');
125+
} else {
126+
++m;
127+
}
128+
}
129+
for (int i = s.size() - 1;; --i) {
130+
k %= m;
131+
if (k == 0 && isalpha(s[i])) {
132+
return string(1, s[i]);
133+
}
134+
if (isdigit(s[i])) {
135+
m /= (s[i] - '0');
136+
} else {
137+
--m;
138+
}
139+
}
140+
}
141+
};
142+
```
143+
144+
### **Go**
145+
146+
```go
147+
func decodeAtIndex(s string, k int) string {
148+
m := 0
149+
for _, c := range s {
150+
if c >= '0' && c <= '9' {
151+
m *= int(c - '0')
152+
} else {
153+
m++
154+
}
155+
}
156+
for i := len(s) - 1; ; i-- {
157+
k %= m
158+
if k == 0 && s[i] >= 'a' && s[i] <= 'z' {
159+
return string(s[i])
160+
}
161+
if s[i] >= '0' && s[i] <= '9' {
162+
m /= int(s[i] - '0')
163+
} else {
164+
m--
165+
}
166+
}
167+
}
168+
```
69169

170+
### **TypeScript**
171+
172+
```ts
173+
function decodeAtIndex(s: string, k: number): string {
174+
let m = 0n;
175+
for (const c of s) {
176+
if (c >= '1' && c <= '9') {
177+
m *= BigInt(c);
178+
} else {
179+
++m;
180+
}
181+
}
182+
for (let i = s.length - 1; ; --i) {
183+
if (k >= m) {
184+
k %= Number(m);
185+
}
186+
if (k === 0 && s[i] >= 'a' && s[i] <= 'z') {
187+
return s[i];
188+
}
189+
if (s[i] >= '1' && s[i] <= '9') {
190+
m = (m / BigInt(s[i])) | 0n;
191+
} else {
192+
--m;
193+
}
194+
}
195+
}
70196
```
71197

72198
### **...**
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
class Solution {
2+
public:
3+
string decodeAtIndex(string s, int k) {
4+
long long m = 0;
5+
for (char& c : s) {
6+
if (isdigit(c)) {
7+
m *= (c - '0');
8+
} else {
9+
++m;
10+
}
11+
}
12+
for (int i = s.size() - 1;; --i) {
13+
k %= m;
14+
if (k == 0 && isalpha(s[i])) {
15+
return string(1, s[i]);
16+
}
17+
if (isdigit(s[i])) {
18+
m /= (s[i] - '0');
19+
} else {
20+
--m;
21+
}
22+
}
23+
}
24+
};
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
func decodeAtIndex(s string, k int) string {
2+
m := 0
3+
for _, c := range s {
4+
if c >= '0' && c <= '9' {
5+
m *= int(c - '0')
6+
} else {
7+
m++
8+
}
9+
}
10+
for i := len(s) - 1; ; i-- {
11+
k %= m
12+
if k == 0 && s[i] >= 'a' && s[i] <= 'z' {
13+
return string(s[i])
14+
}
15+
if s[i] >= '0' && s[i] <= '9' {
16+
m /= int(s[i] - '0')
17+
} else {
18+
m--
19+
}
20+
}
21+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
class Solution {
2+
public String decodeAtIndex(String s, int k) {
3+
long m = 0;
4+
for (int i = 0; i < s.length(); ++i) {
5+
if (Character.isDigit(s.charAt(i))) {
6+
m *= (s.charAt(i) - '0');
7+
} else {
8+
++m;
9+
}
10+
}
11+
for (int i = s.length() - 1;; --i) {
12+
k %= m;
13+
if (k == 0 && !Character.isDigit(s.charAt(i))) {
14+
return String.valueOf(s.charAt(i));
15+
}
16+
if (Character.isDigit(s.charAt(i))) {
17+
m /= (s.charAt(i) - '0');
18+
} else {
19+
--m;
20+
}
21+
}
22+
}
23+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
class Solution:
2+
def decodeAtIndex(self, s: str, k: int) -> str:
3+
m = 0
4+
for c in s:
5+
if c.isdigit():
6+
m *= int(c)
7+
else:
8+
m += 1
9+
for c in s[::-1]:
10+
k %= m
11+
if k == 0 and c.isalpha():
12+
return c
13+
if c.isdigit():
14+
m //= int(c)
15+
else:
16+
m -= 1

0 commit comments

Comments
 (0)