Skip to content

Commit d74125f

Browse files
committed
feat: add solutions to lc problem: No.2055
No.2055.Plates Between Candles
1 parent 49968e7 commit d74125f

File tree

6 files changed

+367
-2
lines changed

6 files changed

+367
-2
lines changed

solution/2000-2099/2055.Plates Between Candles/README.md

Lines changed: 128 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,22 +56,149 @@
5656

5757
<!-- 这里可写通用的实现逻辑 -->
5858

59+
预处理得到每个位置最左边、最右边的蜡烛位置 `left`, `right`
60+
61+
对于每个查询 `(i, j)`,可以获取到区间左端、右端蜡烛位置 `right[i]`, `left[j]`,然后前缀和求解两个蜡烛之间的盘子数量即可。
62+
5963
<!-- tabs:start -->
6064

6165
### **Python3**
6266

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

6569
```python
66-
70+
class Solution:
71+
def platesBetweenCandles(self, s: str, queries: List[List[int]]) -> List[int]:
72+
n = len(s)
73+
presum = [0] * (n + 1)
74+
for i, c in enumerate(s):
75+
presum[i + 1] = presum[i] + (c == '*')
76+
77+
left, right = [0] * n, [0] * n
78+
l = r = -1
79+
for i, c in enumerate(s):
80+
if c == '|':
81+
l = i
82+
left[i] = l
83+
for i in range(n - 1, -1, -1):
84+
if s[i] == '|':
85+
r = i
86+
right[i] = r
87+
88+
ans = [0] * len(queries)
89+
for k, (l, r) in enumerate(queries):
90+
i, j = right[l], left[r]
91+
if i >= 0 and j >= 0 and i < j:
92+
ans[k] = presum[j] - presum[i + 1]
93+
return ans
6794
```
6895

6996
### **Java**
7097

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

73100
```java
101+
class Solution {
102+
public int[] platesBetweenCandles(String s, int[][] queries) {
103+
int n = s.length();
104+
int[] presum = new int[n + 1];
105+
for (int i = 0; i < n; ++i) {
106+
presum[i + 1] = presum[i] + (s.charAt(i) == '*' ? 1 : 0);
107+
}
108+
int[] left = new int[n];
109+
int[] right = new int[n];
110+
for (int i = 0, l = -1; i < n; ++i) {
111+
if (s.charAt(i) == '|') {
112+
l = i;
113+
}
114+
left[i] = l;
115+
}
116+
for (int i = n - 1, r = -1; i >= 0; --i) {
117+
if (s.charAt(i) == '|') {
118+
r = i;
119+
}
120+
right[i] = r;
121+
}
122+
int[] ans = new int[queries.length];
123+
for (int k = 0; k < queries.length; ++k) {
124+
int i = right[queries[k][0]];
125+
int j = left[queries[k][1]];
126+
if (i >= 0 && j >= 0 && i < j) {
127+
ans[k] = presum[j] - presum[i + 1];
128+
}
129+
}
130+
return ans;
131+
}
132+
}
133+
```
134+
135+
### **C++**
136+
137+
```cpp
138+
class Solution {
139+
public:
140+
vector<int> platesBetweenCandles(string s, vector<vector<int>>& queries) {
141+
int n = s.size();
142+
vector<int> presum(n + 1);
143+
for (int i = 0; i < n; ++i) presum[i + 1] = presum[i] + (s[i] == '*');
144+
vector<int> left(n);
145+
vector<int> right(n);
146+
for (int i = 0, l = -1; i < n; ++i)
147+
{
148+
if (s[i] == '|') l = i;
149+
left[i] = l;
150+
}
151+
for (int i = n - 1, r = -1; i >= 0; --i)
152+
{
153+
if (s[i] == '|') r = i;
154+
right[i] = r;
155+
}
156+
vector<int> ans(queries.size());
157+
for (int k = 0; k < queries.size(); ++k)
158+
{
159+
int i = right[queries[k][0]];
160+
int j = left[queries[k][1]];
161+
if (i >= 0 && j >= 0 && i < j) ans[k] = presum[j] - presum[i + 1];
162+
}
163+
return ans;
164+
}
165+
};
166+
```
74167
168+
### **Go**
169+
170+
```go
171+
func platesBetweenCandles(s string, queries [][]int) []int {
172+
n := len(s)
173+
presum := make([]int, n+1)
174+
for i := range s {
175+
if s[i] == '*' {
176+
presum[i+1] = 1
177+
}
178+
presum[i+1] += presum[i]
179+
}
180+
left, right := make([]int, n), make([]int, n)
181+
for i, l := 0, -1; i < n; i++ {
182+
if s[i] == '|' {
183+
l = i
184+
}
185+
left[i] = l
186+
}
187+
for i, r := n-1, -1; i >= 0; i-- {
188+
if s[i] == '|' {
189+
r = i
190+
}
191+
right[i] = r
192+
}
193+
ans := make([]int, len(queries))
194+
for k, q := range queries {
195+
i, j := right[q[0]], left[q[1]]
196+
if i >= 0 && j >= 0 && i < j {
197+
ans[k] = presum[j] - presum[i+1]
198+
}
199+
}
200+
return ans
201+
}
75202
```
76203

77204
### **...**

solution/2000-2099/2055.Plates Between Candles/README_EN.md

Lines changed: 124 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,13 +53,136 @@
5353
### **Python3**
5454

5555
```python
56-
56+
class Solution:
57+
def platesBetweenCandles(self, s: str, queries: List[List[int]]) -> List[int]:
58+
n = len(s)
59+
presum = [0] * (n + 1)
60+
for i, c in enumerate(s):
61+
presum[i + 1] = presum[i] + (c == '*')
62+
63+
left, right = [0] * n, [0] * n
64+
l = r = -1
65+
for i, c in enumerate(s):
66+
if c == '|':
67+
l = i
68+
left[i] = l
69+
for i in range(n - 1, -1, -1):
70+
if s[i] == '|':
71+
r = i
72+
right[i] = r
73+
74+
ans = [0] * len(queries)
75+
for k, (l, r) in enumerate(queries):
76+
i, j = right[l], left[r]
77+
if i >= 0 and j >= 0 and i < j:
78+
ans[k] = presum[j] - presum[i + 1]
79+
return ans
5780
```
5881

5982
### **Java**
6083

6184
```java
85+
class Solution {
86+
public int[] platesBetweenCandles(String s, int[][] queries) {
87+
int n = s.length();
88+
int[] presum = new int[n + 1];
89+
for (int i = 0; i < n; ++i) {
90+
presum[i + 1] = presum[i] + (s.charAt(i) == '*' ? 1 : 0);
91+
}
92+
int[] left = new int[n];
93+
int[] right = new int[n];
94+
for (int i = 0, l = -1; i < n; ++i) {
95+
if (s.charAt(i) == '|') {
96+
l = i;
97+
}
98+
left[i] = l;
99+
}
100+
for (int i = n - 1, r = -1; i >= 0; --i) {
101+
if (s.charAt(i) == '|') {
102+
r = i;
103+
}
104+
right[i] = r;
105+
}
106+
int[] ans = new int[queries.length];
107+
for (int k = 0; k < queries.length; ++k) {
108+
int i = right[queries[k][0]];
109+
int j = left[queries[k][1]];
110+
if (i >= 0 && j >= 0 && i < j) {
111+
ans[k] = presum[j] - presum[i + 1];
112+
}
113+
}
114+
return ans;
115+
}
116+
}
117+
```
118+
119+
### **C++**
120+
121+
```cpp
122+
class Solution {
123+
public:
124+
vector<int> platesBetweenCandles(string s, vector<vector<int>>& queries) {
125+
int n = s.size();
126+
vector<int> presum(n + 1);
127+
for (int i = 0; i < n; ++i) presum[i + 1] = presum[i] + (s[i] == '*');
128+
vector<int> left(n);
129+
vector<int> right(n);
130+
for (int i = 0, l = -1; i < n; ++i)
131+
{
132+
if (s[i] == '|') l = i;
133+
left[i] = l;
134+
}
135+
for (int i = n - 1, r = -1; i >= 0; --i)
136+
{
137+
if (s[i] == '|') r = i;
138+
right[i] = r;
139+
}
140+
vector<int> ans(queries.size());
141+
for (int k = 0; k < queries.size(); ++k)
142+
{
143+
int i = right[queries[k][0]];
144+
int j = left[queries[k][1]];
145+
if (i >= 0 && j >= 0 && i < j) ans[k] = presum[j] - presum[i + 1];
146+
}
147+
return ans;
148+
}
149+
};
150+
```
62151
152+
### **Go**
153+
154+
```go
155+
func platesBetweenCandles(s string, queries [][]int) []int {
156+
n := len(s)
157+
presum := make([]int, n+1)
158+
for i := range s {
159+
if s[i] == '*' {
160+
presum[i+1] = 1
161+
}
162+
presum[i+1] += presum[i]
163+
}
164+
left, right := make([]int, n), make([]int, n)
165+
for i, l := 0, -1; i < n; i++ {
166+
if s[i] == '|' {
167+
l = i
168+
}
169+
left[i] = l
170+
}
171+
for i, r := n-1, -1; i >= 0; i-- {
172+
if s[i] == '|' {
173+
r = i
174+
}
175+
right[i] = r
176+
}
177+
ans := make([]int, len(queries))
178+
for k, q := range queries {
179+
i, j := right[q[0]], left[q[1]]
180+
if i >= 0 && j >= 0 && i < j {
181+
ans[k] = presum[j] - presum[i+1]
182+
}
183+
}
184+
return ans
185+
}
63186
```
64187

65188
### **...**
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
class Solution {
2+
public:
3+
vector<int> platesBetweenCandles(string s, vector<vector<int>>& queries) {
4+
int n = s.size();
5+
vector<int> presum(n + 1);
6+
for (int i = 0; i < n; ++i) presum[i + 1] = presum[i] + (s[i] == '*');
7+
vector<int> left(n);
8+
vector<int> right(n);
9+
for (int i = 0, l = -1; i < n; ++i)
10+
{
11+
if (s[i] == '|') l = i;
12+
left[i] = l;
13+
}
14+
for (int i = n - 1, r = -1; i >= 0; --i)
15+
{
16+
if (s[i] == '|') r = i;
17+
right[i] = r;
18+
}
19+
vector<int> ans(queries.size());
20+
for (int k = 0; k < queries.size(); ++k)
21+
{
22+
int i = right[queries[k][0]];
23+
int j = left[queries[k][1]];
24+
if (i >= 0 && j >= 0 && i < j) ans[k] = presum[j] - presum[i + 1];
25+
}
26+
return ans;
27+
}
28+
};
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
func platesBetweenCandles(s string, queries [][]int) []int {
2+
n := len(s)
3+
presum := make([]int, n+1)
4+
for i := range s {
5+
if s[i] == '*' {
6+
presum[i+1] = 1
7+
}
8+
presum[i+1] += presum[i]
9+
}
10+
left, right := make([]int, n), make([]int, n)
11+
for i, l := 0, -1; i < n; i++ {
12+
if s[i] == '|' {
13+
l = i
14+
}
15+
left[i] = l
16+
}
17+
for i, r := n-1, -1; i >= 0; i-- {
18+
if s[i] == '|' {
19+
r = i
20+
}
21+
right[i] = r
22+
}
23+
ans := make([]int, len(queries))
24+
for k, q := range queries {
25+
i, j := right[q[0]], left[q[1]]
26+
if i >= 0 && j >= 0 && i < j {
27+
ans[k] = presum[j] - presum[i+1]
28+
}
29+
}
30+
return ans
31+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
class Solution {
2+
public int[] platesBetweenCandles(String s, int[][] queries) {
3+
int n = s.length();
4+
int[] presum = new int[n + 1];
5+
for (int i = 0; i < n; ++i) {
6+
presum[i + 1] = presum[i] + (s.charAt(i) == '*' ? 1 : 0);
7+
}
8+
int[] left = new int[n];
9+
int[] right = new int[n];
10+
for (int i = 0, l = -1; i < n; ++i) {
11+
if (s.charAt(i) == '|') {
12+
l = i;
13+
}
14+
left[i] = l;
15+
}
16+
for (int i = n - 1, r = -1; i >= 0; --i) {
17+
if (s.charAt(i) == '|') {
18+
r = i;
19+
}
20+
right[i] = r;
21+
}
22+
int[] ans = new int[queries.length];
23+
for (int k = 0; k < queries.length; ++k) {
24+
int i = right[queries[k][0]];
25+
int j = left[queries[k][1]];
26+
if (i >= 0 && j >= 0 && i < j) {
27+
ans[k] = presum[j] - presum[i + 1];
28+
}
29+
}
30+
return ans;
31+
}
32+
}

0 commit comments

Comments
 (0)