@@ -77,11 +77,11 @@ M 1000</pre>
77
77
78
78
<!-- 这里可写通用的实现逻辑 -->
79
79
80
- ** 方法一:模拟 **
80
+ ** 方法一:贪心 **
81
81
82
- 贪心算法实现 。
82
+ 我们可以先将所有可能的符号 $cs$ 和对应的数值 $vs$ 列出来,然后从大到小枚举每个数值 $vs [ i ] $,每次尽可能多地使用该数值对应的符号 $cs [ i ] $,直到数字 $num$ 变为 $0$ 。
83
83
84
- 时间复杂度为 $O(1 )$,空间复杂度为 $O(1)$ 。
84
+ 时间复杂度为 $O(m )$,空间复杂度为 $O(m)$。其中 $m$ 为符号的个数 。
85
85
86
86
<!-- tabs:start -->
87
87
@@ -92,27 +92,15 @@ M 1000</pre>
92
92
``` python
93
93
class Solution :
94
94
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)
116
104
```
117
105
118
106
### ** Java**
@@ -122,17 +110,16 @@ class Solution:
122
110
``` java
123
111
class Solution {
124
112
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));
133
120
}
134
121
}
135
- return sb . toString();
122
+ return ans . toString();
136
123
}
137
124
}
138
125
```
@@ -143,13 +130,13 @@ class Solution {
143
130
class Solution {
144
131
public:
145
132
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 };
148
135
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] ;
153
140
}
154
141
}
155
142
return ans;
@@ -161,26 +148,24 @@ public:
161
148
162
149
```go
163
150
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])
170
158
}
171
159
}
172
- return ans
160
+ return ans.String()
173
161
}
174
162
```
175
163
176
164
### ** TypeScript**
177
165
178
166
``` ts
179
167
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 [] = [
184
169
' M' ,
185
170
' CM' ,
186
171
' D' ,
@@ -195,14 +180,15 @@ function intToRoman(num: number): string {
195
180
' IV' ,
196
181
' I' ,
197
182
];
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 ]);
203
189
}
204
190
}
205
- return ans ;
191
+ return ans . join ( ' ' ) ;
206
192
}
207
193
```
208
194
0 commit comments