Skip to content

Commit f76db13

Browse files
committed
feat: add solutions to lc problem: No.0246
No.0246.Strobogrammatic Number
1 parent 2972e92 commit f76db13

File tree

6 files changed

+124
-90
lines changed

6 files changed

+124
-90
lines changed

solution/0200-0299/0246.Strobogrammatic Number/README.md

+49-29
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,14 @@
3838

3939
<!-- 这里可写通用的实现逻辑 -->
4040

41+
**方法一:双指针模拟**
42+
43+
我们定义一个数组 $d$,其中 $d[i]$ 表示数字 $i$ 旋转 180° 之后的数字。如果 $d[i]$ 为 $-1$,表示数字 $i$ 不能旋转 180° 得到一个数字。
44+
45+
定义两个指针 $i$ 和 $j$,分别指向字符串的左右两端,然后不断向中间移动指针,判断 $d[num[i]]$ 和 $num[j]$ 是否相等,如果不相等,说明该字符串不是中心对称数,直接返回 $false$ 即可。如果 $i \gt j$,说明遍历完了字符串,返回 $true$。
46+
47+
时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 为字符串的长度。
48+
4149
<!-- tabs:start -->
4250

4351
### **Python3**
@@ -47,22 +55,13 @@
4755
```python
4856
class Solution:
4957
def isStrobogrammatic(self, num: str) -> bool:
50-
def match(a, b):
51-
if a in {'0', '1', '8'}:
52-
return a == b
53-
if a == '6':
54-
return b == '9'
55-
if a == '9':
56-
return b == '6'
57-
return False
58-
59-
n = len(num)
60-
i, j = 0, n - 1
58+
d = [0, 1, -1, -1, -1, -1, 9, -1, 8, 6]
59+
i, j = 0, len(num) - 1
6160
while i <= j:
62-
if not match(num[i], num[j]):
61+
a, b = int(num[i]), int(num[j])
62+
if d[a] != b:
6363
return False
64-
i += 1
65-
j -= 1
64+
i, j = i + 1, j - 1
6665
return True
6766
```
6867

@@ -73,27 +72,48 @@ class Solution:
7372
```java
7473
class Solution {
7574
public boolean isStrobogrammatic(String num) {
76-
int n = num.length();
77-
for (int i = 0, j = n - 1; i <= j; ++i, --j) {
78-
if (!match(num.charAt(i), num.charAt(j))) return false;
75+
int[] d = new int[] {0, 1, -1, -1, -1, -1, 9, -1, 8, 6};
76+
for (int i = 0, j = num.length() - 1; i <= j; ++i, --j) {
77+
int a = num.charAt(i) - '0', b = num.charAt(j) - '0';
78+
if (d[a] != b) {
79+
return false;
80+
}
7981
}
8082
return true;
8183
}
84+
}
85+
```
8286

83-
private boolean match(char a, char b) {
84-
switch (a) {
85-
case '0':
86-
case '1':
87-
case '8':
88-
return a == b;
89-
case '6':
90-
return b == '9';
91-
case '9':
92-
return b == '6';
93-
default:
94-
return false;
87+
### **C++**
88+
89+
```cpp
90+
class Solution {
91+
public:
92+
bool isStrobogrammatic(string num) {
93+
vector<int> d = {0, 1, -1, -1, -1, -1, 9, -1, 8, 6};
94+
for (int i = 0, j = num.size() - 1; i <= j; ++i, --j) {
95+
int a = num[i] - '0', b = num[j] - '0';
96+
if (d[a] != b) {
97+
return false;
98+
}
9599
}
100+
return true;
96101
}
102+
};
103+
```
104+
105+
### **Go**
106+
107+
```go
108+
func isStrobogrammatic(num string) bool {
109+
d := []int{0, 1, -1, -1, -1, -1, 9, -1, 8, 6}
110+
for i, j := 0, len(num)-1; i <= j; i, j = i+1, j-1 {
111+
a, b := int(num[i]-'0'), int(num[j]-'0')
112+
if d[a] != b {
113+
return false
114+
}
115+
}
116+
return true
97117
}
98118
```
99119

solution/0200-0299/0246.Strobogrammatic Number/README_EN.md

+41-29
Original file line numberDiff line numberDiff line change
@@ -48,22 +48,13 @@
4848
```python
4949
class Solution:
5050
def isStrobogrammatic(self, num: str) -> bool:
51-
def match(a, b):
52-
if a in {'0', '1', '8'}:
53-
return a == b
54-
if a == '6':
55-
return b == '9'
56-
if a == '9':
57-
return b == '6'
58-
return False
59-
60-
n = len(num)
61-
i, j = 0, n - 1
51+
d = [0, 1, -1, -1, -1, -1, 9, -1, 8, 6]
52+
i, j = 0, len(num) - 1
6253
while i <= j:
63-
if not match(num[i], num[j]):
54+
a, b = int(num[i]), int(num[j])
55+
if d[a] != b:
6456
return False
65-
i += 1
66-
j -= 1
57+
i, j = i + 1, j - 1
6758
return True
6859
```
6960

@@ -72,27 +63,48 @@ class Solution:
7263
```java
7364
class Solution {
7465
public boolean isStrobogrammatic(String num) {
75-
int n = num.length();
76-
for (int i = 0, j = n - 1; i <= j; ++i, --j) {
77-
if (!match(num.charAt(i), num.charAt(j))) return false;
66+
int[] d = new int[] {0, 1, -1, -1, -1, -1, 9, -1, 8, 6};
67+
for (int i = 0, j = num.length() - 1; i <= j; ++i, --j) {
68+
int a = num.charAt(i) - '0', b = num.charAt(j) - '0';
69+
if (d[a] != b) {
70+
return false;
71+
}
7872
}
7973
return true;
8074
}
75+
}
76+
```
8177

82-
private boolean match(char a, char b) {
83-
switch (a) {
84-
case '0':
85-
case '1':
86-
case '8':
87-
return a == b;
88-
case '6':
89-
return b == '9';
90-
case '9':
91-
return b == '6';
92-
default:
93-
return false;
78+
### **C++**
79+
80+
```cpp
81+
class Solution {
82+
public:
83+
bool isStrobogrammatic(string num) {
84+
vector<int> d = {0, 1, -1, -1, -1, -1, 9, -1, 8, 6};
85+
for (int i = 0, j = num.size() - 1; i <= j; ++i, --j) {
86+
int a = num[i] - '0', b = num[j] - '0';
87+
if (d[a] != b) {
88+
return false;
89+
}
9490
}
91+
return true;
9592
}
93+
};
94+
```
95+
96+
### **Go**
97+
98+
```go
99+
func isStrobogrammatic(num string) bool {
100+
d := []int{0, 1, -1, -1, -1, -1, 9, -1, 8, 6}
101+
for i, j := 0, len(num)-1; i <= j; i, j = i+1, j-1 {
102+
a, b := int(num[i]-'0'), int(num[j]-'0')
103+
if d[a] != b {
104+
return false
105+
}
106+
}
107+
return true
96108
}
97109
```
98110

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
class Solution {
2+
public:
3+
bool isStrobogrammatic(string num) {
4+
vector<int> d = {0, 1, -1, -1, -1, -1, 9, -1, 8, 6};
5+
for (int i = 0, j = num.size() - 1; i <= j; ++i, --j) {
6+
int a = num[i] - '0', b = num[j] - '0';
7+
if (d[a] != b) {
8+
return false;
9+
}
10+
}
11+
return true;
12+
}
13+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
func isStrobogrammatic(num string) bool {
2+
d := []int{0, 1, -1, -1, -1, -1, 9, -1, 8, 6}
3+
for i, j := 0, len(num)-1; i <= j; i, j = i+1, j-1 {
4+
a, b := int(num[i]-'0'), int(num[j]-'0')
5+
if d[a] != b {
6+
return false
7+
}
8+
}
9+
return true
10+
}
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,12 @@
11
class Solution {
22
public boolean isStrobogrammatic(String num) {
3-
int n = num.length();
4-
for (int i = 0, j = n - 1; i <= j; ++i, --j) {
5-
if (!match(num.charAt(i), num.charAt(j))) return false;
3+
int[] d = new int[] {0, 1, -1, -1, -1, -1, 9, -1, 8, 6};
4+
for (int i = 0, j = num.length() - 1; i <= j; ++i, --j) {
5+
int a = num.charAt(i) - '0', b = num.charAt(j) - '0';
6+
if (d[a] != b) {
7+
return false;
8+
}
69
}
710
return true;
811
}
9-
10-
private boolean match(char a, char b) {
11-
switch (a) {
12-
case '0':
13-
case '1':
14-
case '8':
15-
return a == b;
16-
case '6':
17-
return b == '9';
18-
case '9':
19-
return b == '6';
20-
default:
21-
return false;
22-
}
23-
}
2412
}
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,10 @@
11
class Solution:
22
def isStrobogrammatic(self, num: str) -> bool:
3-
def match(a, b):
4-
if a in {'0', '1', '8'}:
5-
return a == b
6-
if a == '6':
7-
return b == '9'
8-
if a == '9':
9-
return b == '6'
10-
return False
11-
12-
n = len(num)
13-
i, j = 0, n - 1
3+
d = [0, 1, -1, -1, -1, -1, 9, -1, 8, 6]
4+
i, j = 0, len(num) - 1
145
while i <= j:
15-
if not match(num[i], num[j]):
6+
a, b = int(num[i]), int(num[j])
7+
if d[a] != b:
168
return False
17-
i += 1
18-
j -= 1
9+
i, j = i + 1, j - 1
1910
return True

0 commit comments

Comments
 (0)