Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 69c4702

Browse files
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)

AltStyle によって変換されたページ (->オリジナル) /