Skip to content

Commit a9d74d7

Browse files
committed
feat: add solutions to lc problem: No.0165
No.0165.Compare Version Numbers
1 parent 5804242 commit a9d74d7

File tree

7 files changed

+166
-113
lines changed

7 files changed

+166
-113
lines changed

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

Lines changed: 69 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -61,22 +61,25 @@
6161

6262
<!-- 这里可写通用的实现逻辑 -->
6363

64-
**1. 字符串分割**:分割两个字符串,比较对应的修订号。
64+
**方法一:双指针**
6565

66-
**2. 双指针**
66+
同时遍历两个字符串,用两个指针 $i$ 和 $j$ 分别指向两个字符串的当前位置,初始时 $i = j = 0$。
67+
68+
每次取出两个字符串中对应的修订号,记为 $a$ 和 $b$,比较 $a$ 和 $b$ 的大小,如果 $a \lt b$,则返回 $-1$;如果 $a \gt b$,则返回 $1$;如果 $a = b$,则继续比较下一对修订号。
69+
70+
时间复杂度 $O(\max(m, n))$,空间复杂度 $O(1)$。其中 $m$ 和 $n$ 分别是两个字符串的长度。
6771

6872
<!-- tabs:start -->
6973

7074
### **Python3**
7175

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

74-
双指针。
75-
7678
```python
7779
class Solution:
7880
def compareVersion(self, version1: str, version2: str) -> int:
79-
i, j, m, n = 0, 0, len(version1), len(version2)
81+
m, n = len(version1), len(version2)
82+
i = j = 0
8083
while i < m or j < n:
8184
a = b = 0
8285
while i < m and version1[i] != '.':
@@ -87,8 +90,7 @@ class Solution:
8790
j += 1
8891
if a != b:
8992
return -1 if a < b else 1
90-
i += 1
91-
j += 1
93+
i, j = i + 1, j + 1
9294
return 0
9395
```
9496

@@ -99,13 +101,14 @@ class Solution:
99101
```java
100102
class Solution {
101103
public int compareVersion(String version1, String version2) {
102-
for (int i = 0, j = 0; i < version1.length() || j < version2.length(); ++i, ++j) {
104+
int m = version1.length(), n = version2.length();
105+
for (int i = 0, j = 0; i < m || j < n; ++i, ++j) {
103106
int a = 0, b = 0;
104-
while (i < version1.length() && version1.charAt(i) != '.') {
105-
a = a * 10 + version1.charAt(i++) - '0';
107+
while (i < m && version1.charAt(i) != '.') {
108+
a = a * 10 + (version1.charAt(i++) - '0');
106109
}
107-
while (j < version2.length() && version2.charAt(j) != '.') {
108-
b = b * 10 + version2.charAt(j++) - '0';
110+
while (j < n && version2.charAt(j) != '.') {
111+
b = b * 10 + (version2.charAt(j++) - '0');
109112
}
110113
if (a != b) {
111114
return a < b ? -1 : 1;
@@ -116,36 +119,24 @@ class Solution {
116119
}
117120
```
118121

119-
### **TypeScript**
120-
121-
```ts
122-
function compareVersion(version1: string, version2: string): number {
123-
let v1 = version1.split('.'),
124-
v2 = version2.split('.');
125-
for (let i = 0; i < Math.max(v1.length, v2.length); i++) {
126-
let c1 = Number(v1[i] || 0),
127-
c2 = Number(v2[i] || 0);
128-
if (c1 > c2) return 1;
129-
if (c1 < c2) return -1;
130-
}
131-
return 0;
132-
}
133-
```
134-
135122
### **C++**
136123

137124
```cpp
138125
class Solution {
139126
public:
140127
int compareVersion(string version1, string version2) {
141-
for (int i = 0, j = 0; i < version1.size() || j < version2.size(); ++i, ++j) {
128+
int m = version1.size(), n = version2.size();
129+
for (int i = 0, j = 0; i < m || j < n; ++i, ++j) {
142130
int a = 0, b = 0;
143-
while (i < version1.size() && version1[i] != '.')
144-
a = a * 10 + version1[i++] - '0';
145-
while (j < version2.size() && version2[j] != '.')
146-
b = b * 10 + version2[j++] - '0';
147-
if (a != b)
131+
while (i < m && version1[i] != '.') {
132+
a = a * 10 + (version1[i++] - '0');
133+
}
134+
while (j < n && version2[j] != '.') {
135+
b = b * 10 + (version2[j++] - '0');
136+
}
137+
if (a != b) {
148138
return a < b ? -1 : 1;
139+
}
149140
}
150141
return 0;
151142
}
@@ -156,13 +147,14 @@ public:
156147
157148
```go
158149
func compareVersion(version1 string, version2 string) int {
159-
for i, j := 0, 0; i < len(version1) || j < len(version2); i, j = i+1, j+1 {
160-
a, b := 0, 0
161-
for i < len(version1) && version1[i] != '.' {
150+
m, n := len(version1), len(version2)
151+
for i, j := 0, 0; i < m || j < n; i, j = i+1, j+1 {
152+
var a, b int
153+
for i < m && version1[i] != '.' {
162154
a = a*10 + int(version1[i]-'0')
163155
i++
164156
}
165-
for j < len(version2) && version2[j] != '.' {
157+
for j < n && version2[j] != '.' {
166158
b = b*10 + int(version2[j]-'0')
167159
j++
168160
}
@@ -177,6 +169,45 @@ func compareVersion(version1 string, version2 string) int {
177169
}
178170
```
179171

172+
### **C#**
173+
174+
```cs
175+
public class Solution {
176+
public int CompareVersion(string version1, string version2) {
177+
int m = version1.Length, n = version2.Length;
178+
for (int i = 0, j = 0; i < m || j < n; ++i, ++j) {
179+
int a = 0, b = 0;
180+
while (i < m && version1[i] != '.') {
181+
a = a * 10 + (version1[i++] - '0');
182+
}
183+
while (j < n && version2[j] != '.') {
184+
b = b * 10 + (version2[j++] - '0');
185+
}
186+
if (a != b) {
187+
return a < b ? -1 : 1;
188+
}
189+
}
190+
return 0;
191+
}
192+
}
193+
```
194+
195+
### **TypeScript**
196+
197+
```ts
198+
function compareVersion(version1: string, version2: string): number {
199+
let v1 = version1.split('.'),
200+
v2 = version2.split('.');
201+
for (let i = 0; i < Math.max(v1.length, v2.length); i++) {
202+
let c1 = Number(v1[i] || 0),
203+
c2 = Number(v2[i] || 0);
204+
if (c1 > c2) return 1;
205+
if (c1 < c2) return -1;
206+
}
207+
return 0;
208+
}
209+
```
210+
180211
### **...**
181212

182213
```

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

Lines changed: 63 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,8 @@
6565
```python
6666
class Solution:
6767
def compareVersion(self, version1: str, version2: str) -> int:
68-
i, j, m, n = 0, 0, len(version1), len(version2)
68+
m, n = len(version1), len(version2)
69+
i = j = 0
6970
while i < m or j < n:
7071
a = b = 0
7172
while i < m and version1[i] != '.':
@@ -76,8 +77,7 @@ class Solution:
7677
j += 1
7778
if a != b:
7879
return -1 if a < b else 1
79-
i += 1
80-
j += 1
80+
i, j = i + 1, j + 1
8181
return 0
8282
```
8383

@@ -86,13 +86,14 @@ class Solution:
8686
```java
8787
class Solution {
8888
public int compareVersion(String version1, String version2) {
89-
for (int i = 0, j = 0; i < version1.length() || j < version2.length(); ++i, ++j) {
89+
int m = version1.length(), n = version2.length();
90+
for (int i = 0, j = 0; i < m || j < n; ++i, ++j) {
9091
int a = 0, b = 0;
91-
while (i < version1.length() && version1.charAt(i) != '.') {
92-
a = a * 10 + version1.charAt(i++) - '0';
92+
while (i < m && version1.charAt(i) != '.') {
93+
a = a * 10 + (version1.charAt(i++) - '0');
9394
}
94-
while (j < version2.length() && version2.charAt(j) != '.') {
95-
b = b * 10 + version2.charAt(j++) - '0';
95+
while (j < n && version2.charAt(j) != '.') {
96+
b = b * 10 + (version2.charAt(j++) - '0');
9697
}
9798
if (a != b) {
9899
return a < b ? -1 : 1;
@@ -103,36 +104,24 @@ class Solution {
103104
}
104105
```
105106

106-
### **TypeScript**
107-
108-
```ts
109-
function compareVersion(version1: string, version2: string): number {
110-
let v1 = version1.split('.'),
111-
v2 = version2.split('.');
112-
for (let i = 0; i < Math.max(v1.length, v2.length); i++) {
113-
let c1 = Number(v1[i] || 0),
114-
c2 = Number(v2[i] || 0);
115-
if (c1 > c2) return 1;
116-
if (c1 < c2) return -1;
117-
}
118-
return 0;
119-
}
120-
```
121-
122107
### **C++**
123108

124109
```cpp
125110
class Solution {
126111
public:
127112
int compareVersion(string version1, string version2) {
128-
for (int i = 0, j = 0; i < version1.size() || j < version2.size(); ++i, ++j) {
113+
int m = version1.size(), n = version2.size();
114+
for (int i = 0, j = 0; i < m || j < n; ++i, ++j) {
129115
int a = 0, b = 0;
130-
while (i < version1.size() && version1[i] != '.')
131-
a = a * 10 + version1[i++] - '0';
132-
while (j < version2.size() && version2[j] != '.')
133-
b = b * 10 + version2[j++] - '0';
134-
if (a != b)
116+
while (i < m && version1[i] != '.') {
117+
a = a * 10 + (version1[i++] - '0');
118+
}
119+
while (j < n && version2[j] != '.') {
120+
b = b * 10 + (version2[j++] - '0');
121+
}
122+
if (a != b) {
135123
return a < b ? -1 : 1;
124+
}
136125
}
137126
return 0;
138127
}
@@ -143,13 +132,14 @@ public:
143132
144133
```go
145134
func compareVersion(version1 string, version2 string) int {
146-
for i, j := 0, 0; i < len(version1) || j < len(version2); i, j = i+1, j+1 {
147-
a, b := 0, 0
148-
for i < len(version1) && version1[i] != '.' {
135+
m, n := len(version1), len(version2)
136+
for i, j := 0, 0; i < m || j < n; i, j = i+1, j+1 {
137+
var a, b int
138+
for i < m && version1[i] != '.' {
149139
a = a*10 + int(version1[i]-'0')
150140
i++
151141
}
152-
for j < len(version2) && version2[j] != '.' {
142+
for j < n && version2[j] != '.' {
153143
b = b*10 + int(version2[j]-'0')
154144
j++
155145
}
@@ -164,6 +154,45 @@ func compareVersion(version1 string, version2 string) int {
164154
}
165155
```
166156

157+
### **C#**
158+
159+
```cs
160+
public class Solution {
161+
public int CompareVersion(string version1, string version2) {
162+
int m = version1.Length, n = version2.Length;
163+
for (int i = 0, j = 0; i < m || j < n; ++i, ++j) {
164+
int a = 0, b = 0;
165+
while (i < m && version1[i] != '.') {
166+
a = a * 10 + (version1[i++] - '0');
167+
}
168+
while (j < n && version2[j] != '.') {
169+
b = b * 10 + (version2[j++] - '0');
170+
}
171+
if (a != b) {
172+
return a < b ? -1 : 1;
173+
}
174+
}
175+
return 0;
176+
}
177+
}
178+
```
179+
180+
### **TypeScript**
181+
182+
```ts
183+
function compareVersion(version1: string, version2: string): number {
184+
let v1 = version1.split('.'),
185+
v2 = version2.split('.');
186+
for (let i = 0; i < Math.max(v1.length, v2.length); i++) {
187+
let c1 = Number(v1[i] || 0),
188+
c2 = Number(v2[i] || 0);
189+
if (c1 > c2) return 1;
190+
if (c1 < c2) return -1;
191+
}
192+
return 0;
193+
}
194+
```
195+
167196
### **...**
168197

169198
```

solution/0100-0199/0165.Compare Version Numbers/Solution.cpp

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,18 @@
11
class Solution {
22
public:
33
int compareVersion(string version1, string version2) {
4-
for (int i = 0, j = 0; i < version1.size() || j < version2.size(); ++i, ++j) {
4+
int m = version1.size(), n = version2.size();
5+
for (int i = 0, j = 0; i < m || j < n; ++i, ++j) {
56
int a = 0, b = 0;
6-
while (i < version1.size() && version1[i] != '.')
7-
a = a * 10 + version1[i++] - '0';
8-
while (j < version2.size() && version2[j] != '.')
9-
b = b * 10 + version2[j++] - '0';
10-
if (a != b)
7+
while (i < m && version1[i] != '.') {
8+
a = a * 10 + (version1[i++] - '0');
9+
}
10+
while (j < n && version2[j] != '.') {
11+
b = b * 10 + (version2[j++] - '0');
12+
}
13+
if (a != b) {
1114
return a < b ? -1 : 1;
15+
}
1216
}
1317
return 0;
1418
}

solution/0100-0199/0165.Compare Version Numbers/Solution.cs

Lines changed: 10 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,17 @@
1-
using System;
2-
using System.Linq;
3-
using System.Collections.Generic;
4-
51
public class Solution {
62
public int CompareVersion(string version1, string version2) {
7-
var parts1 = version1.Split('.').Select(int.Parse).ToList();
8-
var parts2 = version2.Split('.').Select(int.Parse).ToList();
9-
var minLen = Math.Min(parts1.Count, parts2.Count);
10-
for (var i = 0; i < minLen; ++i)
11-
{
12-
if (parts1[i] < parts2[i])
13-
{
14-
return -1;
3+
int m = version1.Length, n = version2.Length;
4+
for (int i = 0, j = 0; i < m || j < n; ++i, ++j) {
5+
int a = 0, b = 0;
6+
while (i < m && version1[i] != '.') {
7+
a = a * 10 + (version1[i++] - '0');
158
}
16-
else if (parts1[i] > parts2[i])
17-
{
18-
return 1;
9+
while (j < n && version2[j] != '.') {
10+
b = b * 10 + (version2[j++] - '0');
11+
}
12+
if (a != b) {
13+
return a < b ? -1 : 1;
1914
}
20-
}
21-
if (parts1.Count > parts2.Count && parts1.Skip(minLen).Any(v => v != 0))
22-
{
23-
return 1;
24-
}
25-
if (parts2.Count > parts1.Count && parts2.Skip(minLen).Any(v => v != 0))
26-
{
27-
return -1;
2815
}
2916
return 0;
3017
}

0 commit comments

Comments
 (0)