Skip to content

Commit e6b0375

Browse files
authored
feat: add solutions to lc problem: No.0165 (#4744)
1 parent 96543e6 commit e6b0375

File tree

4 files changed

+152
-25
lines changed

4 files changed

+152
-25
lines changed

solution/0100-0199/0165.Compare Version Numbers/README.md

Lines changed: 50 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -192,21 +192,63 @@ func compareVersion(version1 string, version2 string) int {
192192

193193
```ts
194194
function compareVersion(version1: string, version2: string): number {
195-
const v1 = version1.split('.');
196-
const v2 = version2.split('.');
197-
for (let i = 0; i < Math.max(v1.length, v2.length); ++i) {
198-
const [n1, n2] = [+v1[i] || 0, +v2[i] || 0];
199-
if (n1 < n2) {
200-
return -1;
195+
const [m, n] = [version1.length, version2.length];
196+
let [i, j] = [0, 0];
197+
while (i < m || j < n) {
198+
let [a, b] = [0, 0];
199+
while (i < m && version1[i] !== '.') {
200+
a = a * 10 + +version1[i];
201+
i++;
201202
}
202-
if (n1 > n2) {
203-
return 1;
203+
while (j < n && version2[j] !== '.') {
204+
b = b * 10 + +version2[j];
205+
j++;
204206
}
207+
if (a !== b) {
208+
return a < b ? -1 : 1;
209+
}
210+
i++;
211+
j++;
205212
}
206213
return 0;
207214
}
208215
```
209216

217+
#### Rust
218+
219+
```rust
220+
impl Solution {
221+
pub fn compare_version(version1: String, version2: String) -> i32 {
222+
let (bytes1, bytes2) = (version1.as_bytes(), version2.as_bytes());
223+
let (m, n) = (bytes1.len(), bytes2.len());
224+
let (mut i, mut j) = (0, 0);
225+
226+
while i < m || j < n {
227+
let mut a = 0;
228+
let mut b = 0;
229+
230+
while i < m && bytes1[i] != b'.' {
231+
a = a * 10 + (bytes1[i] - b'0') as i32;
232+
i += 1;
233+
}
234+
while j < n && bytes2[j] != b'.' {
235+
b = b * 10 + (bytes2[j] - b'0') as i32;
236+
j += 1;
237+
}
238+
239+
if a != b {
240+
return if a < b { -1 } else { 1 };
241+
}
242+
243+
i += 1;
244+
j += 1;
245+
}
246+
247+
0
248+
}
249+
}
250+
```
251+
210252
#### C#
211253

212254
```cs

solution/0100-0199/0165.Compare Version Numbers/README_EN.md

Lines changed: 57 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,13 @@ tags:
8282

8383
<!-- solution:start -->
8484

85-
### Solution 1
85+
### Solution 1: Two Pointers
86+
87+
Traverse both strings simultaneously using two pointers $i$ and $j$, which point to the current positions in each string, starting with $i = j = 0$.
88+
89+
Each time, extract the corresponding revision numbers from both strings, denoted as $a$ and $b$. Compare $a$ and $b$: if $a \lt b$, return $-1$; if $a \gt b$, return $1$; if $a = b$, continue to compare the next pair of revision numbers.
90+
91+
The time complexity is $O(\max(m, n))$, and the space complexity is $O(1)$, where $m$ and $n$ are the lengths of the two strings.
8692

8793
<!-- tabs:start -->
8894

@@ -184,21 +190,63 @@ func compareVersion(version1 string, version2 string) int {
184190

185191
```ts
186192
function compareVersion(version1: string, version2: string): number {
187-
const v1 = version1.split('.');
188-
const v2 = version2.split('.');
189-
for (let i = 0; i < Math.max(v1.length, v2.length); ++i) {
190-
const [n1, n2] = [+v1[i] || 0, +v2[i] || 0];
191-
if (n1 < n2) {
192-
return -1;
193+
const [m, n] = [version1.length, version2.length];
194+
let [i, j] = [0, 0];
195+
while (i < m || j < n) {
196+
let [a, b] = [0, 0];
197+
while (i < m && version1[i] !== '.') {
198+
a = a * 10 + +version1[i];
199+
i++;
193200
}
194-
if (n1 > n2) {
195-
return 1;
201+
while (j < n && version2[j] !== '.') {
202+
b = b * 10 + +version2[j];
203+
j++;
196204
}
205+
if (a !== b) {
206+
return a < b ? -1 : 1;
207+
}
208+
i++;
209+
j++;
197210
}
198211
return 0;
199212
}
200213
```
201214

215+
#### Rust
216+
217+
```rust
218+
impl Solution {
219+
pub fn compare_version(version1: String, version2: String) -> i32 {
220+
let (bytes1, bytes2) = (version1.as_bytes(), version2.as_bytes());
221+
let (m, n) = (bytes1.len(), bytes2.len());
222+
let (mut i, mut j) = (0, 0);
223+
224+
while i < m || j < n {
225+
let mut a = 0;
226+
let mut b = 0;
227+
228+
while i < m && bytes1[i] != b'.' {
229+
a = a * 10 + (bytes1[i] - b'0') as i32;
230+
i += 1;
231+
}
232+
while j < n && bytes2[j] != b'.' {
233+
b = b * 10 + (bytes2[j] - b'0') as i32;
234+
j += 1;
235+
}
236+
237+
if a != b {
238+
return if a < b { -1 } else { 1 };
239+
}
240+
241+
i += 1;
242+
j += 1;
243+
}
244+
245+
0
246+
}
247+
}
248+
```
249+
202250
#### C#
203251

204252
```cs
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
impl Solution {
2+
pub fn compare_version(version1: String, version2: String) -> i32 {
3+
let (bytes1, bytes2) = (version1.as_bytes(), version2.as_bytes());
4+
let (m, n) = (bytes1.len(), bytes2.len());
5+
let (mut i, mut j) = (0, 0);
6+
7+
while i < m || j < n {
8+
let mut a = 0;
9+
let mut b = 0;
10+
11+
while i < m && bytes1[i] != b'.' {
12+
a = a * 10 + (bytes1[i] - b'0') as i32;
13+
i += 1;
14+
}
15+
while j < n && bytes2[j] != b'.' {
16+
b = b * 10 + (bytes2[j] - b'0') as i32;
17+
j += 1;
18+
}
19+
20+
if a != b {
21+
return if a < b { -1 } else { 1 };
22+
}
23+
24+
i += 1;
25+
j += 1;
26+
}
27+
28+
0
29+
}
30+
}
Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,21 @@
11
function compareVersion(version1: string, version2: string): number {
2-
const v1 = version1.split('.');
3-
const v2 = version2.split('.');
4-
for (let i = 0; i < Math.max(v1.length, v2.length); ++i) {
5-
const [n1, n2] = [+v1[i] || 0, +v2[i] || 0];
6-
if (n1 < n2) {
7-
return -1;
2+
const [m, n] = [version1.length, version2.length];
3+
let [i, j] = [0, 0];
4+
while (i < m || j < n) {
5+
let [a, b] = [0, 0];
6+
while (i < m && version1[i] !== '.') {
7+
a = a * 10 + +version1[i];
8+
i++;
89
}
9-
if (n1 > n2) {
10-
return 1;
10+
while (j < n && version2[j] !== '.') {
11+
b = b * 10 + +version2[j];
12+
j++;
1113
}
14+
if (a !== b) {
15+
return a < b ? -1 : 1;
16+
}
17+
i++;
18+
j++;
1219
}
1320
return 0;
1421
}

0 commit comments

Comments
 (0)