【Leetcode 13】Roman to Integer

Roman numerals are represented by seven different symbols: IVXLCD and M.

Symbol       Value
I             1
V             5
X             10
L             50
C             100
D             500
M             1000

For example, two is written as II in Roman numeral, just two one's added together. Twelve is written as, XII, which is simply X + II. The number twenty seven is written as XXVII, which is XX + V + II.

Roman numerals are usually written largest to smallest from left to right. However, the numeral for four is not IIII. Instead, the number four is written as IV. Because the one is before the five we subtract it making four. The same principle applies to the number nine, which is written as IX. There are six instances where subtraction is used:

  • I can be placed before V (5) and X (10) to make 4 and 9. 
  • X can be placed before L (50) and C (100) to make 40 and 90. 
  • C can be placed before D (500) and M (1000) to make 400 and 900.

Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 to 3999.

Example 1:

Input: "III"
Output: 3

Example 2:

Input: "IV"
Output: 4

Example 3:

Input: "IX"
Output: 9

Example 4:

Input: "LVIII"
Output: 58
Explanation: C = 100, L = 50, XXX = 30 and III = 3.

Example 5:

Input: "MCMXCIV"
Output: 1994
Explanation: M = 1000, CM = 900, XC = 90 and IV = 4.

 

题目翻译:

翻译罗马数字变成阿拉伯数字。罗马数字有一个特点是,从整体角度看,数据是从大到小排列的,

举个例子: DMMCVIII一定可以拆分成 DM + MC + VIII ,其中两个M是大数,将原有数据拆分成几块。

题目只需要让我们翻译罗马数字成为阿拉伯数字,但没有让我们判断是不是合格的罗马数字,这样省去了很多麻烦。

罗马数字有这样一个规律,从后往前看,如果这个数字的前边有大于等于它的数字,这个数字就一定是正的,比如III是3,VIII是8。但是如果一个数字突然小于它后边的数字,那么这个数字一定是负数,即IV就是4。以此类推,假设 IVII是正确的罗马数字,那么他的值就为  -1,+5,+1,+1,这样的加和为6。

使用map把字符都变成数字,之后定义temp存储从后向前最大的值,如果这个数字前边的比temp小,就都为负,如果前边的数字,比temp大,就为正。

#include<vector>
#include <iostream>
#include <string>
#include <cmath>
#include<map>
using namespace std;

class Solution {
public:
	int romanToInt(string s)
	{

		int n = s.length() - 1;
		int sum = 0;
		int temp = 1;
		
		map<char, int> map1;
		map1.insert({ 'I',1 });
		map1.insert({ 'V',5 });
		map1.insert({ 'X',10 });
		map1.insert({ 'L',50 });
		map1.insert({ 'C',100 });
		map1.insert({ 'D',500 });
		map1.insert({ 'M',1000 });

		//cout << map1[s[1]] << endl;
		for (int i = n; i >= 0; i--)
		{
			if (map1[s[i]] >= temp)
			{
				temp = map1[s[i]];
				sum += temp;
			}
			else
			{
				sum -= map1[s[i]];
			}
		}

		return sum;
	}
};


int main()
{
	string s;
	getline(cin, s);
	Solution so;
	int n = so.romanToInt(s);
	cout << n << endl;

	
	system("pause");
	return 0;
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值