Skip to content

Commit b079ce1

Browse files
committed
[E:54/531, M:52/969, H:6/386] add No: 13 Roman to Integer
1 parent b103edc commit b079ce1

File tree

13 files changed

+511
-1
lines changed

13 files changed

+511
-1
lines changed
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
## [罗马数字转整数](https://leetcode-cn.com/problems/roman-to-integer/)
2+
3+
罗马数字包含以下七种字符: `I`, `V`, `X`, `L``C``D` 和 `M`
4+
5+
`**字符** **数值**
6+
I 1
7+
V 5
8+
X 10
9+
L 50
10+
C 100
11+
D 500
12+
M 1000`
13+
14+
例如, 罗马数字 2 写做 `II` ,即为两个并列的 1。12 写做 `XII` ,即为 `X` + `II` 。 27 写做  `XXVII`, 即为 `XX` + `V` + `II` 。
15+
16+
通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 `IIII`,而是 `IV`。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 `IX`。这个特殊的规则只适用于以下六种情况:
17+
18+
* `I` 可以放在 `V` (5) 和 `X` (10) 的左边,来表示 4 和 9。
19+
* `X` 可以放在 `L` (50) 和 `C` (100) 的左边,来表示 40 和 90。 
20+
* `C` 可以放在 `D` (500) 和 `M` (1000) 的左边,来表示 400 和 900。
21+
22+
给定一个罗马数字,将其转换成整数。输入确保在 1 到 3999 的范围内。
23+
24+
 
25+
26+
**示例 1:**
27+
28+
`**输入:** "III"
29+
**输出:** 3`
30+
31+
**示例 2:**
32+
33+
`**输入:** "IV"
34+
**输出:** 4`
35+
36+
**示例 3:**
37+
38+
`**输入:** "IX"
39+
**输出:** 9`
40+
41+
**示例 4:**
42+
43+
`**输入:** "LVIII"
44+
**输出:** 58
45+
**解释:** L = 50, V= 5, III = 3.
46+
`
47+
48+
**示例 5:**
49+
50+
`**输入:** "MCMXCIV"
51+
**输出:** 1994
52+
**解释:** M = 1000, CM = 900, XC = 90, IV = 4.`
53+
54+
 
55+
56+
**提示:**
57+
58+
* 题目所给测试用例皆符合罗马数字书写规则,不会出现跨位等情况。
59+
* IC 和 IM 这样的例子并不符合题目要求,49 应该写作 XLIX,999 应该写作 CMXCIX 。
60+
* 关于罗马数字的详尽书写规则,可以参考 [罗马数字 - Mathematics] (https://b2b.partcommunity.com/community/knowledge/zh_CN/detail/10753/%E7%BD%97%E9%A9%AC%E6%95%B0%E5%AD%97#knowledge_article)。
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
package main
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"reflect"
7+
"time"
8+
9+
"github.com/gladmo/leetcode/leet"
10+
"github.com/gladmo/leetcode/questions/serial/简单/13/golang/solution"
11+
)
12+
13+
func main() {
14+
15+
tests := []struct {
16+
name string
17+
input string
18+
want int
19+
}{
20+
{
21+
name: "test-III",
22+
input: "III",
23+
want: 3,
24+
},
25+
{
26+
name: "test-IV",
27+
input: "IV",
28+
want: 4,
29+
},
30+
{
31+
name: "test-IX",
32+
input: "IX",
33+
want: 9,
34+
},
35+
{
36+
name: "test-LVIII",
37+
input: "LVIII",
38+
want: 58,
39+
},
40+
{
41+
name: "test-MCMXCIV",
42+
input: "MCMXCIV",
43+
want: 1994,
44+
},
45+
{
46+
name: "test-XLIX",
47+
input: "XLIX",
48+
want: 49,
49+
},
50+
{
51+
name: "test-CMXCIX",
52+
input: "CMXCIX",
53+
want: 999,
54+
},
55+
}
56+
57+
testLog := leet.NewTestLog(len(tests))
58+
defer testLog.Render()
59+
60+
timeoutDuration := time.Second * 2
61+
62+
for idx, test := range tests {
63+
// 超时检测
64+
timeout := leet.Timeout(timeoutDuration, func(ctx context.Context, cancel context.CancelFunc) {
65+
solution.Export(test.input)
66+
cancel()
67+
})
68+
69+
if timeout {
70+
testLog.Fail(idx+1, test.name, "timeout")
71+
continue
72+
}
73+
74+
got := solution.Export(test.input)
75+
if !reflect.DeepEqual(test.want, got) {
76+
testLog.Fail(idx+1, test.name, fmt.Sprintf("want: %v, got %v.", test.want, got))
77+
continue
78+
}
79+
80+
testLog.Pass(idx+1, test.name)
81+
}
82+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package solution
2+
3+
func Export(s string) int {
4+
return romanToInt(s)
5+
}
6+
7+
/****************************************************/
8+
/******** 以下为 Leetcode 示例部分(提交PR请还原) *******/
9+
/******** 使用 (./leetcode clear) 初始化所有问题 *******/
10+
/****************************************************/
11+
12+
func romanToInt(s string) int {
13+
14+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package solution
2+
3+
func Export(s string) int {
4+
return romanToInt(s)
5+
}
6+
7+
/****************************************************/
8+
/******** 以下为 Leetcode 示例部分(提交PR请还原) *******/
9+
/******** 使用 (./leetcode clear) 初始化所有问题 *******/
10+
/****************************************************/
11+
12+
func romanToInt(s string) int {
13+
14+
}

questions/store.json

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
## [罗马数字转整数](https://leetcode-cn.com/problems/roman-to-integer/)
2+
3+
罗马数字包含以下七种字符: `I`, `V`, `X`, `L``C``D` 和 `M`
4+
5+
`**字符** **数值**
6+
I 1
7+
V 5
8+
X 10
9+
L 50
10+
C 100
11+
D 500
12+
M 1000`
13+
14+
例如, 罗马数字 2 写做 `II` ,即为两个并列的 1。12 写做 `XII` ,即为 `X` + `II` 。 27 写做  `XXVII`, 即为 `XX` + `V` + `II` 。
15+
16+
通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 `IIII`,而是 `IV`。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 `IX`。这个特殊的规则只适用于以下六种情况:
17+
18+
* `I` 可以放在 `V` (5) 和 `X` (10) 的左边,来表示 4 和 9。
19+
* `X` 可以放在 `L` (50) 和 `C` (100) 的左边,来表示 40 和 90。 
20+
* `C` 可以放在 `D` (500) 和 `M` (1000) 的左边,来表示 400 和 900。
21+
22+
给定一个罗马数字,将其转换成整数。输入确保在 1 到 3999 的范围内。
23+
24+
 
25+
26+
**示例 1:**
27+
28+
`**输入:** "III"
29+
**输出:** 3`
30+
31+
**示例 2:**
32+
33+
`**输入:** "IV"
34+
**输出:** 4`
35+
36+
**示例 3:**
37+
38+
`**输入:** "IX"
39+
**输出:** 9`
40+
41+
**示例 4:**
42+
43+
`**输入:** "LVIII"
44+
**输出:** 58
45+
**解释:** L = 50, V= 5, III = 3.
46+
`
47+
48+
**示例 5:**
49+
50+
`**输入:** "MCMXCIV"
51+
**输出:** 1994
52+
**解释:** M = 1000, CM = 900, XC = 90, IV = 4.`
53+
54+
 
55+
56+
**提示:**
57+
58+
* 题目所给测试用例皆符合罗马数字书写规则,不会出现跨位等情况。
59+
* IC 和 IM 这样的例子并不符合题目要求,49 应该写作 XLIX,999 应该写作 CMXCIX 。
60+
* 关于罗马数字的详尽书写规则,可以参考 [罗马数字 - Mathematics] (https://b2b.partcommunity.com/community/knowledge/zh_CN/detail/10753/%E7%BD%97%E9%A9%AC%E6%95%B0%E5%AD%97#knowledge_article)。
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
package main
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"reflect"
7+
"time"
8+
9+
"github.com/gladmo/leetcode/leet"
10+
"github.com/gladmo/leetcode/questions/serial/简单/13/golang/solution"
11+
)
12+
13+
func main() {
14+
15+
tests := []struct {
16+
name string
17+
input string
18+
want int
19+
}{
20+
{
21+
name: "test-III",
22+
input: "III",
23+
want: 3,
24+
},
25+
{
26+
name: "test-IV",
27+
input: "IV",
28+
want: 4,
29+
},
30+
{
31+
name: "test-IX",
32+
input: "IX",
33+
want: 9,
34+
},
35+
{
36+
name: "test-LVIII",
37+
input: "LVIII",
38+
want: 58,
39+
},
40+
{
41+
name: "test-MCMXCIV",
42+
input: "MCMXCIV",
43+
want: 1994,
44+
},
45+
{
46+
name: "test-XLIX",
47+
input: "XLIX",
48+
want: 49,
49+
},
50+
{
51+
name: "test-CMXCIX",
52+
input: "CMXCIX",
53+
want: 999,
54+
},
55+
}
56+
57+
testLog := leet.NewTestLog(len(tests))
58+
defer testLog.Render()
59+
60+
timeoutDuration := time.Second * 2
61+
62+
for idx, test := range tests {
63+
// 超时检测
64+
timeout := leet.Timeout(timeoutDuration, func(ctx context.Context, cancel context.CancelFunc) {
65+
solution.Export(test.input)
66+
cancel()
67+
})
68+
69+
if timeout {
70+
testLog.Fail(idx+1, test.name, "timeout")
71+
continue
72+
}
73+
74+
got := solution.Export(test.input)
75+
if !reflect.DeepEqual(test.want, got) {
76+
testLog.Fail(idx+1, test.name, fmt.Sprintf("want: %v, got %v.", test.want, got))
77+
continue
78+
}
79+
80+
testLog.Pass(idx+1, test.name)
81+
}
82+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package solution
2+
3+
func Export(s string) int {
4+
return romanToInt(s)
5+
}
6+
7+
/****************************************************/
8+
/******** 以下为 Leetcode 示例部分(提交PR请还原) *******/
9+
/******** 使用 (./leetcode clear) 初始化所有问题 *******/
10+
/****************************************************/
11+
12+
func romanToInt(s string) int {
13+
14+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package solution
2+
3+
func Export(s string) int {
4+
return romanToInt(s)
5+
}
6+
7+
/****************************************************/
8+
/******** 以下为 Leetcode 示例部分(提交PR请还原) *******/
9+
/******** 使用 (./leetcode clear) 初始化所有问题 *******/
10+
/****************************************************/
11+
12+
func romanToInt(s string) int {
13+
14+
}

0 commit comments

Comments
 (0)