Skip to content

Commit aeeb294

Browse files
committed
feat: update solutions to lc problem: No.0012
No.0012.Integer to Roman
1 parent f76f157 commit aeeb294

File tree

9 files changed

+156
-169
lines changed

9 files changed

+156
-169
lines changed

solution/0000-0099/0012.Integer to Roman/README.md

+42-56
Original file line numberDiff line numberDiff line change
@@ -77,11 +77,11 @@ M 1000</pre>
7777

7878
<!-- 这里可写通用的实现逻辑 -->
7979

80-
**方法一:模拟**
80+
**方法一:贪心**
8181

82-
贪心算法实现
82+
我们可以先将所有可能的符号 $cs$ 和对应的数值 $vs$ 列出来,然后从大到小枚举每个数值 $vs[i]$,每次尽可能多地使用该数值对应的符号 $cs[i]$,直到数字 $num$ 变为 $0$
8383

84-
时间复杂度为 $O(1)$,空间复杂度为 $O(1)$
84+
时间复杂度为 $O(m)$,空间复杂度为 $O(m)$。其中 $m$ 为符号的个数
8585

8686
<!-- tabs:start -->
8787

@@ -92,27 +92,15 @@ M 1000</pre>
9292
```python
9393
class Solution:
9494
def intToRoman(self, num: int) -> str:
95-
nums = [
96-
(1000, 'M'),
97-
(900, 'CM'),
98-
(500, 'D'),
99-
(400, 'CD'),
100-
(100, 'C'),
101-
(90, 'XC'),
102-
(50, 'L'),
103-
(40, 'XL'),
104-
(10, 'X'),
105-
(9, 'IX'),
106-
(5, 'V'),
107-
(4, 'IV'),
108-
(1, 'I'),
109-
]
110-
res = []
111-
for k, v in nums:
112-
while num >= k:
113-
num -= k
114-
res.append(v)
115-
return ''.join(res)
95+
cs = ('M', 'CM', 'D', 'CD', 'C', 'XC',
96+
'L', 'XL', 'X', 'IX', 'V', 'IV', 'I')
97+
vs = (1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1)
98+
ans = []
99+
for c, v in zip(cs, vs):
100+
while num >= v:
101+
num -= v
102+
ans.append(c)
103+
return ''.join(ans)
116104
```
117105

118106
### **Java**
@@ -122,17 +110,16 @@ class Solution:
122110
```java
123111
class Solution {
124112
public String intToRoman(int num) {
125-
int[] nums = new int[] {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
126-
String[] romans
127-
= new String[] {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
128-
StringBuilder sb = new StringBuilder();
129-
for (int i = 0; i < nums.length; ++i) {
130-
while (num >= nums[i]) {
131-
num -= nums[i];
132-
sb.append(romans[i]);
113+
List<String> cs = List.of("M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I");
114+
List<Integer> vs = List.of(1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1);
115+
StringBuilder ans = new StringBuilder();
116+
for (int i = 0, n = cs.size(); i < n; ++i) {
117+
while (num >= vs.get(i)) {
118+
num -= vs.get(i);
119+
ans.append(cs.get(i));
133120
}
134121
}
135-
return sb.toString();
122+
return ans.toString();
136123
}
137124
}
138125
```
@@ -143,13 +130,13 @@ class Solution {
143130
class Solution {
144131
public:
145132
string intToRoman(int num) {
146-
vector<int> nums {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
147-
vector<string> romans {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
133+
vector<string> cs = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
134+
vector<int> vs = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
148135
string ans;
149-
for (int i = 0; i < nums.size(); ++i) {
150-
while (num >= nums[i]) {
151-
num -= nums[i];
152-
ans.append(romans[i]);
136+
for (int i = 0; i < cs.size(); ++i) {
137+
while (num >= vs[i]) {
138+
num -= vs[i];
139+
ans += cs[i];
153140
}
154141
}
155142
return ans;
@@ -161,26 +148,24 @@ public:
161148
162149
```go
163150
func intToRoman(num int) string {
164-
ans := ""
165-
values := []int{1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1}
166-
romans := []string{"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"}
167-
for i, value := range values {
168-
for value <= num {
169-
ans, num = ans+romans[i], num-value
151+
cs := []string{"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"}
152+
vs := []int{1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1}
153+
ans := &strings.Builder{}
154+
for i, v := range vs {
155+
for num >= v {
156+
num -= v
157+
ans.WriteString(cs[i])
170158
}
171159
}
172-
return ans
160+
return ans.String()
173161
}
174162
```
175163

176164
### **TypeScript**
177165

178166
```ts
179167
function intToRoman(num: number): string {
180-
const nums: number[] = [
181-
1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1,
182-
];
183-
const romans: string[] = [
168+
const cs: string[] = [
184169
'M',
185170
'CM',
186171
'D',
@@ -195,14 +180,15 @@ function intToRoman(num: number): string {
195180
'IV',
196181
'I',
197182
];
198-
let ans: string = '';
199-
for (let i = 0; i < nums.length; ++i) {
200-
while (num >= nums[i]) {
201-
num -= nums[i];
202-
ans += romans[i];
183+
const vs: number[] = [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1];
184+
const ans: string[] = [];
185+
for (let i = 0; i < vs.length; ++i) {
186+
while (num >= vs[i]) {
187+
num -= vs[i];
188+
ans.push(cs[i]);
203189
}
204190
}
205-
return ans;
191+
return ans.join('');
206192
}
207193
```
208194

solution/0000-0099/0012.Integer to Roman/README_EN.md

+39-53
Original file line numberDiff line numberDiff line change
@@ -73,45 +73,32 @@ Time complexity $O(1)$, Space complexity $O(1)$.
7373
```python
7474
class Solution:
7575
def intToRoman(self, num: int) -> str:
76-
nums = [
77-
(1000, 'M'),
78-
(900, 'CM'),
79-
(500, 'D'),
80-
(400, 'CD'),
81-
(100, 'C'),
82-
(90, 'XC'),
83-
(50, 'L'),
84-
(40, 'XL'),
85-
(10, 'X'),
86-
(9, 'IX'),
87-
(5, 'V'),
88-
(4, 'IV'),
89-
(1, 'I'),
90-
]
91-
res = []
92-
for k, v in nums:
93-
while num >= k:
94-
num -= k
95-
res.append(v)
96-
return ''.join(res)
76+
cs = ('M', 'CM', 'D', 'CD', 'C', 'XC',
77+
'L', 'XL', 'X', 'IX', 'V', 'IV', 'I')
78+
vs = (1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1)
79+
ans = []
80+
for c, v in zip(cs, vs):
81+
while num >= v:
82+
num -= v
83+
ans.append(c)
84+
return ''.join(ans)
9785
```
9886

9987
### **Java**
10088

10189
```java
10290
class Solution {
10391
public String intToRoman(int num) {
104-
int[] nums = new int[] {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
105-
String[] romans
106-
= new String[] {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
107-
StringBuilder sb = new StringBuilder();
108-
for (int i = 0; i < nums.length; ++i) {
109-
while (num >= nums[i]) {
110-
num -= nums[i];
111-
sb.append(romans[i]);
92+
List<String> cs = List.of("M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I");
93+
List<Integer> vs = List.of(1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1);
94+
StringBuilder ans = new StringBuilder();
95+
for (int i = 0, n = cs.size(); i < n; ++i) {
96+
while (num >= vs.get(i)) {
97+
num -= vs.get(i);
98+
ans.append(cs.get(i));
11299
}
113100
}
114-
return sb.toString();
101+
return ans.toString();
115102
}
116103
}
117104
```
@@ -122,13 +109,13 @@ class Solution {
122109
class Solution {
123110
public:
124111
string intToRoman(int num) {
125-
vector<int> nums {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
126-
vector<string> romans {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
112+
vector<string> cs = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
113+
vector<int> vs = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
127114
string ans;
128-
for (int i = 0; i < nums.size(); ++i) {
129-
while (num >= nums[i]) {
130-
num -= nums[i];
131-
ans.append(romans[i]);
115+
for (int i = 0; i < cs.size(); ++i) {
116+
while (num >= vs[i]) {
117+
num -= vs[i];
118+
ans += cs[i];
132119
}
133120
}
134121
return ans;
@@ -140,26 +127,24 @@ public:
140127
141128
```go
142129
func intToRoman(num int) string {
143-
ans := ""
144-
values := []int{1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1}
145-
romans := []string{"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"}
146-
for i, value := range values {
147-
for value <= num {
148-
ans, num = ans+romans[i], num-value
130+
cs := []string{"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"}
131+
vs := []int{1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1}
132+
ans := &strings.Builder{}
133+
for i, v := range vs {
134+
for num >= v {
135+
num -= v
136+
ans.WriteString(cs[i])
149137
}
150138
}
151-
return ans
139+
return ans.String()
152140
}
153141
```
154142

155143
### **TypeScript**
156144

157145
```ts
158146
function intToRoman(num: number): string {
159-
const nums: number[] = [
160-
1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1,
161-
];
162-
const romans: string[] = [
147+
const cs: string[] = [
163148
'M',
164149
'CM',
165150
'D',
@@ -174,14 +159,15 @@ function intToRoman(num: number): string {
174159
'IV',
175160
'I',
176161
];
177-
let ans: string = '';
178-
for (let i = 0; i < nums.length; ++i) {
179-
while (num >= nums[i]) {
180-
num -= nums[i];
181-
ans += romans[i];
162+
const vs: number[] = [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1];
163+
const ans: string[] = [];
164+
for (let i = 0; i < vs.length; ++i) {
165+
while (num >= vs[i]) {
166+
num -= vs[i];
167+
ans.push(cs[i]);
182168
}
183169
}
184-
return ans;
170+
return ans.join('');
185171
}
186172
```
187173

Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
class Solution {
22
public:
33
string intToRoman(int num) {
4-
vector<int> nums{1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
5-
vector<string> romans{"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
4+
vector<string> cs = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
5+
vector<int> vs = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
66
string ans;
7-
for (int i = 0; i < nums.size(); ++i) {
8-
while (num >= nums[i]) {
9-
num -= nums[i];
10-
ans.append(romans[i]);
7+
for (int i = 0; i < cs.size(); ++i) {
8+
while (num >= vs[i]) {
9+
num -= vs[i];
10+
ans += cs[i];
1111
}
1212
}
1313
return ans;
1414
}
15-
};
15+
};
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
func intToRoman(num int) string {
2-
ans := ""
3-
values := []int{1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1}
4-
romans := []string{"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"}
5-
for i, value := range values {
6-
for value <= num {
7-
ans, num = ans+romans[i], num-value
2+
cs := []string{"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"}
3+
vs := []int{1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1}
4+
ans := &strings.Builder{}
5+
for i, v := range vs {
6+
for num >= v {
7+
num -= v
8+
ans.WriteString(cs[i])
89
}
910
}
10-
return ans
11+
return ans.String()
1112
}
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
11
class Solution {
22
public String intToRoman(int num) {
3-
int[] nums = new int[] {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
4-
String[] romans
5-
= new String[] {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
6-
StringBuilder sb = new StringBuilder();
7-
for (int i = 0; i < nums.length; ++i) {
8-
while (num >= nums[i]) {
9-
num -= nums[i];
10-
sb.append(romans[i]);
3+
List<String> cs = List.of("M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I");
4+
List<Integer> vs = List.of(1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1);
5+
StringBuilder ans = new StringBuilder();
6+
for (int i = 0, n = cs.size(); i < n; ++i) {
7+
while (num >= vs.get(i)) {
8+
num -= vs.get(i);
9+
ans.append(cs.get(i));
1110
}
1211
}
13-
return sb.toString();
12+
return ans.toString();
1413
}
1514
}
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,11 @@
11
class Solution:
22
def intToRoman(self, num: int) -> str:
3-
nums = [
4-
(1000, 'M'),
5-
(900, 'CM'),
6-
(500, 'D'),
7-
(400, 'CD'),
8-
(100, 'C'),
9-
(90, 'XC'),
10-
(50, 'L'),
11-
(40, 'XL'),
12-
(10, 'X'),
13-
(9, 'IX'),
14-
(5, 'V'),
15-
(4, 'IV'),
16-
(1, 'I'),
17-
]
18-
res = []
19-
for k, v in nums:
20-
while num >= k:
21-
num -= k
22-
res.append(v)
23-
return ''.join(res)
3+
cs = ('M', 'CM', 'D', 'CD', 'C', 'XC',
4+
'L', 'XL', 'X', 'IX', 'V', 'IV', 'I')
5+
vs = (1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1)
6+
ans = []
7+
for c, v in zip(cs, vs):
8+
while num >= v:
9+
num -= v
10+
ans.append(c)
11+
return ''.join(ans)

0 commit comments

Comments
 (0)