Skip to content

Commit e697b6c

Browse files
committed
feat: add solutions to lc problems: No.0367,0844,1385
- No.0367.Valid Perfect Square - No.0844.Backspace String Compare - No.1385.Find the Distance Value Between Two Arrays
1 parent 2f01e7b commit e697b6c

File tree

12 files changed

+592
-36
lines changed

12 files changed

+592
-36
lines changed

solution/0300-0399/0367.Valid Perfect Square/README.md

+41-13
Original file line numberDiff line numberDiff line change
@@ -40,15 +40,15 @@
4040

4141
**方法一:二分查找**
4242

43-
不断循环二分枚举数字,判断该数的平方与 num 的大小关系,进而缩短空间,继续循环直至 `left < right` 不成立。循环结束判断 left² 与 num 是否相等。
43+
不断循环二分枚举数字,判断该数的平方与 $num$ 的大小关系,进而缩短空间,继续循环直至 `left < right` 不成立。循环结束判断 $left^2$$num$ 是否相等。
4444

45-
时间复杂度 O(logn)
45+
时间复杂度:$O(logN)$
4646

4747
**方法二:转换为数学问题**
4848

49-
由于 `n² = 1 + 3 + 5 + ... + (2n-1)`,对数字 num 不断减去 i (`i = 1, 3, 5, ...`) 直至 num 不大于 0,如果最终 num 等于 0,说明是一个有效的完全平方数。
49+
由于 `n² = 1 + 3 + 5 + ... + (2n-1)`,对数字 $num$ 不断减去 i (`i = 1, 3, 5, ...`) 直至 $num$ 不大于 0,如果最终 $num$ 等于 0,说明是一个有效的完全平方数。
5050

51-
时间复杂度 O(sqrt(n))
51+
时间复杂度:$O(sqrt(N))$
5252

5353
<!-- tabs:start -->
5454

@@ -165,25 +165,53 @@ func isPerfectSquare(num int) bool {
165165
}
166166
```
167167

168+
### **TypeScript**
169+
170+
```ts
171+
function isPerfectSquare(num: number): boolean {
172+
let left = 1;
173+
let right = num >> 1;
174+
while (left < right) {
175+
const mid = (left + right) >>> 1;
176+
if (mid * mid < num) {
177+
left = mid + 1;
178+
} else {
179+
right = mid;
180+
}
181+
}
182+
return left * left === num;
183+
}
184+
```
185+
186+
```ts
187+
function isPerfectSquare(num: number): boolean {
188+
let i = 1;
189+
while (num > 0) {
190+
num -= i;
191+
i += 2;
192+
}
193+
return num === 0;
194+
}
195+
```
196+
168197
### **Rust**
169198

170199
```rust
171200
use std::cmp::Ordering;
172-
173201
impl Solution {
174-
pub fn is_perfect_square(mut num: i32) -> bool {
202+
pub fn is_perfect_square(num: i32) -> bool {
175203
let num: i64 = num as i64;
176-
let mut l = 0;
177-
let mut r = num;
178-
while l < r {
179-
let mid = l + (r - l) / 2;
204+
let mut left = 1;
205+
let mut right = num >> 1;
206+
while left < right {
207+
let mid = left + (right - left) / 2;
180208
match (mid * mid).cmp(&num) {
181-
Ordering::Less => l = mid + 1,
182-
Ordering::Greater => r = mid - 1,
209+
Ordering::Less => left = mid + 1,
210+
Ordering::Greater => right = mid - 1,
183211
Ordering::Equal => return true,
184212
}
185213
}
186-
r * r == num
214+
left * left == num
187215
}
188216
}
189217
```

solution/0300-0399/0367.Valid Perfect Square/README_EN.md

+37-9
Original file line numberDiff line numberDiff line change
@@ -153,25 +153,53 @@ func isPerfectSquare(num int) bool {
153153
}
154154
```
155155

156+
### **TypeScript**
157+
158+
```ts
159+
function isPerfectSquare(num: number): boolean {
160+
let left = 1;
161+
let right = num >> 1;
162+
while (left < right) {
163+
const mid = (left + right) >>> 1;
164+
if (mid * mid < num) {
165+
left = mid + 1;
166+
} else {
167+
right = mid;
168+
}
169+
}
170+
return left * left === num;
171+
}
172+
```
173+
174+
```ts
175+
function isPerfectSquare(num: number): boolean {
176+
let i = 1;
177+
while (num > 0) {
178+
num -= i;
179+
i += 2;
180+
}
181+
return num === 0;
182+
}
183+
```
184+
156185
### **Rust**
157186

158187
```rust
159188
use std::cmp::Ordering;
160-
161189
impl Solution {
162-
pub fn is_perfect_square(mut num: i32) -> bool {
190+
pub fn is_perfect_square(num: i32) -> bool {
163191
let num: i64 = num as i64;
164-
let mut l = 0;
165-
let mut r = num;
166-
while l < r {
167-
let mid = l + (r - l) / 2;
192+
let mut left = 1;
193+
let mut right = num >> 1;
194+
while left < right {
195+
let mid = left + (right - left) / 2;
168196
match (mid * mid).cmp(&num) {
169-
Ordering::Less => l = mid + 1,
170-
Ordering::Greater => r = mid - 1,
197+
Ordering::Less => left = mid + 1,
198+
Ordering::Greater => right = mid - 1,
171199
Ordering::Equal => return true,
172200
}
173201
}
174-
r * r == num
202+
left * left == num
175203
}
176204
}
177205
```
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,17 @@
11
use std::cmp::Ordering;
2-
32
impl Solution {
4-
pub fn is_perfect_square(mut num: i32) -> bool {
3+
pub fn is_perfect_square(num: i32) -> bool {
54
let num: i64 = num as i64;
6-
let mut l = 0;
7-
let mut r = num;
8-
while l < r {
9-
let mid = l + (r - l) / 2;
5+
let mut left = 1;
6+
let mut right = num >> 1;
7+
while left < right {
8+
let mid = left + (right - left) / 2;
109
match (mid * mid).cmp(&num) {
11-
Ordering::Less => l = mid + 1,
12-
Ordering::Greater => r = mid - 1,
10+
Ordering::Less => left = mid + 1,
11+
Ordering::Greater => right = mid - 1,
1312
Ordering::Equal => return true,
1413
}
1514
}
16-
r * r == num
15+
left * left == num
1716
}
1817
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
function isPerfectSquare(num: number): boolean {
2+
let left = 1;
3+
let right = num >> 1;
4+
while (left < right) {
5+
const mid = (left + right) >>> 1;
6+
if (mid * mid < num) {
7+
left = mid + 1;
8+
} else {
9+
right = mid;
10+
}
11+
}
12+
return left * left === num;
13+
}

solution/0800-0899/0844.Backspace String Compare/README.md

+86
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,92 @@ func backspaceCompare(s string, t string) bool {
233233
}
234234
```
235235

236+
### **TypeScript**
237+
238+
```ts
239+
function backspaceCompare(s: string, t: string): boolean {
240+
let i = s.length - 1;
241+
let j = t.length - 1;
242+
while (i >= 0 || j >= 0) {
243+
let skip = 0;
244+
while (i >= 0) {
245+
if (s[i] === '#') {
246+
skip++;
247+
} else if (skip !== 0) {
248+
skip--;
249+
} else {
250+
break;
251+
}
252+
i--;
253+
}
254+
skip = 0;
255+
while (j >= 0) {
256+
if (t[j] === '#') {
257+
skip++;
258+
} else if (skip !== 0) {
259+
skip--;
260+
} else {
261+
break;
262+
}
263+
j--;
264+
}
265+
if (s[i] !== t[j]) {
266+
return false;
267+
}
268+
i--;
269+
j--;
270+
}
271+
return true;
272+
}
273+
```
274+
275+
### **Rust**
276+
277+
```rust
278+
impl Solution {
279+
pub fn backspace_compare(s: String, t: String) -> bool {
280+
let (s, t) = (s.as_bytes(), t.as_bytes());
281+
let (mut i, mut j) = (s.len(), t.len());
282+
while i != 0 || j != 0 {
283+
let mut skip = 0;
284+
while i != 0 {
285+
if s[i - 1] == b'#' {
286+
skip += 1;
287+
} else if skip != 0 {
288+
skip -= 1;
289+
} else {
290+
break;
291+
}
292+
i -= 1
293+
}
294+
skip = 0;
295+
while j != 0 {
296+
if t[j - 1] == b'#' {
297+
skip += 1;
298+
} else if skip != 0 {
299+
skip -= 1;
300+
} else {
301+
break;
302+
}
303+
j -= 1
304+
}
305+
if i == 0 && j == 0 {
306+
break;
307+
}
308+
if i == 0 || j == 0 {
309+
return false;
310+
}
311+
if s[i - 1] != t[j - 1] {
312+
return false;
313+
}
314+
i -= 1;
315+
j -= 1;
316+
}
317+
true
318+
}
319+
}
320+
```
321+
236322
### **...**
237323

238324
```

solution/0800-0899/0844.Backspace String Compare/README_EN.md

+86
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,92 @@ func backspaceCompare(s string, t string) bool {
215215
}
216216
```
217217

218+
### **TypeScript**
219+
220+
```ts
221+
function backspaceCompare(s: string, t: string): boolean {
222+
let i = s.length - 1;
223+
let j = t.length - 1;
224+
while (i >= 0 || j >= 0) {
225+
let skip = 0;
226+
while (i >= 0) {
227+
if (s[i] === '#') {
228+
skip++;
229+
} else if (skip !== 0) {
230+
skip--;
231+
} else {
232+
break;
233+
}
234+
i--;
235+
}
236+
skip = 0;
237+
while (j >= 0) {
238+
if (t[j] === '#') {
239+
skip++;
240+
} else if (skip !== 0) {
241+
skip--;
242+
} else {
243+
break;
244+
}
245+
j--;
246+
}
247+
if (s[i] !== t[j]) {
248+
return false;
249+
}
250+
i--;
251+
j--;
252+
}
253+
return true;
254+
}
255+
```
256+
257+
### **Rust**
258+
259+
```rust
260+
impl Solution {
261+
pub fn backspace_compare(s: String, t: String) -> bool {
262+
let (s, t) = (s.as_bytes(), t.as_bytes());
263+
let (mut i, mut j) = (s.len(), t.len());
264+
while i != 0 || j != 0 {
265+
let mut skip = 0;
266+
while i != 0 {
267+
if s[i - 1] == b'#' {
268+
skip += 1;
269+
} else if skip != 0 {
270+
skip -= 1;
271+
} else {
272+
break;
273+
}
274+
i -= 1
275+
}
276+
skip = 0;
277+
while j != 0 {
278+
if t[j - 1] == b'#' {
279+
skip += 1;
280+
} else if skip != 0 {
281+
skip -= 1;
282+
} else {
283+
break;
284+
}
285+
j -= 1
286+
}
287+
if i == 0 && j == 0 {
288+
break;
289+
}
290+
if i == 0 || j == 0 {
291+
return false;
292+
}
293+
if s[i - 1] != t[j - 1] {
294+
return false;
295+
}
296+
i -= 1;
297+
j -= 1;
298+
}
299+
true
300+
}
301+
}
302+
```
303+
218304
### **...**
219305

220306
```

0 commit comments

Comments
 (0)