Browse Source

add 'Roman To Integer'

tangs 5 years ago
parent
commit
8e2b4fd873
2 changed files with 120 additions and 0 deletions
  1. 1 0
      .gitignore
  2. 119 0
      tags/string/romanToInteger/main.go

+ 1 - 0
.gitignore

@@ -1 +1,2 @@
 .idea
+test

+ 119 - 0
tags/string/romanToInteger/main.go

@@ -0,0 +1,119 @@
+package main
+
+import "fmt"
+
+func main() {
+	var s string
+
+	s = "III"
+	fmt.Println(romanToInt(s))
+
+	s = "IV"
+	fmt.Println(romanToInt(s))
+
+	s = "IX"
+	fmt.Println(romanToInt(s))
+
+	s = "LVIII"
+	fmt.Println(romanToInt(s))
+
+	s = "MCMXCIV"
+	fmt.Println(romanToInt(s))
+
+	s = "DCXXI"
+	fmt.Println(romanToInt(s))
+}
+
+var roman = map[byte]int{
+	'I': 1,
+	'V': 5,
+	'X': 10,
+	'L': 50,
+	'C': 100,
+	'D': 500,
+	'M': 1000,
+}
+
+var special = map[byte]bool{
+	'I': true,
+	'X': true,
+	'C': true,
+}
+
+func romanToInt(s string) int {
+	var sum, i int
+	var mark byte = 'N'
+	for i = 0; i < len(s); i++ {
+		if mark == 'N' {
+			switch s[i] {
+			case 'I':
+				mark = 'I'
+			case 'V':
+				sum += 5
+			case 'X':
+				mark = 'X'
+			case 'L':
+				sum += 50
+			case 'C':
+				mark = 'C'
+			case 'D':
+				sum += 500
+			case 'M':
+				sum += 1000
+			}
+		} else {
+			tmpMark := mark
+			mark = 'N'
+			switch tmpMark {
+			case 'I':
+				switch s[i] {
+				case 'V':
+					sum += 4
+				case 'X':
+					sum += 9
+				default:
+					sum += roman[tmpMark]
+					if special[s[i]] {
+						mark = s[i]
+					} else {
+						sum += roman[s[i]]
+					}
+				}
+			case 'X':
+				switch s[i] {
+				case 'L':
+					sum += 40
+				case 'C':
+					sum += 90
+				default:
+					sum += roman[tmpMark]
+					if special[s[i]] {
+						mark = s[i]
+					} else {
+						sum += roman[s[i]]
+					}
+				}
+			case 'C':
+				switch s[i] {
+				case 'D':
+					sum += 400
+				case 'M':
+					sum += 900
+				default:
+					sum += roman[tmpMark]
+					if special[s[i]] {
+						mark = s[i]
+					} else {
+						sum += roman[s[i]]
+					}
+				}
+			}
+		}
+		//fmt.Println("sum current is ", sum)
+	}
+	//fmt.Println("sum is ", sum)
+	if mark != 'N' {
+		sum += roman[mark]
+	}
+	return sum
+}