leetcode_13题——Roman to Integer(string,数学问题)

Roman to Integer

Total Accepted: 35099 Total Submissions: 100583My Submissions

Question Solution

Given a roman numeral, convert it to an integer.

Input is guaranteed to be within the range from 1 to 3999.

Hide Tags

Math String

Have you met this question in a real interview?

Yes

No

Discuss

思路

首先,学习一下罗马数字,参考罗马数字 
罗马数字是最古老的数字表示方式,比阿拉伯数组早2000多年,起源于罗马 
罗马数字有如下符号:

基本字符 I V X L C D M
对应阿拉伯数字 1 5 10 50 100 500 1000

计数规则: 相同的数字连写,所表示的数等于这些数字相加得到的数,例如:III = 3小的数字在大的数字右边,所表示的数等于这些数字相加得到的数,例如:VIII = 8小的数字,限于(I、X和C)在大的数字左边,所表示的数等于大数减去小数所得的数,例如:IV = 4正常使用时,连续的数字重复不得超过三次在一个数的上面画横线,表示这个数扩大1000倍(本题只考虑3999以内的数,所以用不到这条规则) 
其次,罗马数字转阿拉伯数字规则(仅限于3999以内): 
从前向后遍历罗马数字,如果某个数比前一个数小,则加上该数。反之,减去前一个数的两倍然后加上该数

#include<iostream>
#include<string>
using namespace std;

int numebr_table(char str)
{
	switch(str)
	{
	case ‘I‘:{return 1;}
	case ‘V‘:{return 5;}
	case ‘X‘:{return 10;}
	case ‘L‘:{return 50;}
	case ‘C‘:{return 100;}
	case ‘D‘:{return 500;}
	case ‘M‘:{return 1000;}
	}
}

int romanToInt(string s) {
	int last_result=0;
	int len=s.size();
	int i=1;
	if(len==0)
		return 0;
	if(len==1)
		return numebr_table(s[0]);
	last_result=numebr_table(s[0]);
	while(i<len)
	{
		if(numebr_table(s[i])<=numebr_table(s[i-1]))
			last_result+=numebr_table(s[i]);
		else
			last_result=last_result+(numebr_table(s[i])-2*numebr_table(s[i-1]));
		i++;
	}
	return last_result;
}

int main()
{
	string s="CIII";
	cout<<romanToInt(s)<<endl;
	system("pause");
	return 1;

}

  

时间: 2024-11-10 08:02:57

leetcode_13题——Roman to Integer(string,数学问题)的相关文章

leetcode第13题--Roman to Integer

Problem: Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 to 3999. 遍历一次输入的字符串,如果不满足类似4或者9的就直接加相应的数,否则减去相应的数.其中对应如下”IVXLCDM“对应{1,5,10,50,100,500,1000} class Solution { public: int romanToInt(string s)

【leetcode刷题笔记】Integer to Roman

Given an integer, convert it to a roman numeral. Input is guaranteed to be within the range from 1 to 3999. 题解:基本的罗马字符和数字对应如下表所示: 罗马字符 数字 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 每隔一个字符又可以与相邻的两个字符组成一个新的数,例如I可以和V和X组成IV和IX,这样又可以生成6个数字,如下表: 罗马字符 数字 IV 4 IX

【leetcode刷题笔记】Roman to Integer

Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 to 3999. 题解:转换的方法:从左往右扫描罗马字符,如果当前的字符对应的数字比上一个数字小,就直接加上这个数字:否则加上这个数字并且减去上一个数字的两倍,然后更新上一个数字.利用一个HashMap存放罗马字符和数字的对应. 罗马数字和阿拉伯数字的对应表格参见http://www.cnblogs.

LeetCode12~14 Integer to Roman/Roman to Integer/Longest Common Prefix

一:Integer to Roman 题目: Given an integer, convert it to a roman numeral. Input is guaranteed to be within the range from 1 to 3999. 链接:https://leetcode.com/problems/integer-to-roman/ 分析:此题关键是确定罗马数字如何表示,比如4并不是IIII而是IV,9并不是VIIII而是IX, 通过不断的取出最高位和余下的得到结果

乘风破浪:LeetCode真题_013_Roman to Integer

乘风破浪:LeetCode真题_013_Roman to Integer 一.前言 上一节我们讨论了如何把阿拉伯数字转换成罗马数字,现在我们需要思考一下如何把罗马数字转换成阿拉伯数字,其实我们仔细观擦这些结构就会发现罗马数字如果前面的比后面的小,就需要用后面的减去前面的.而且如果有这样的运算,也只是两个字符拼接而成的,这为我们解题提供了思路. 二.Roman to Integer 2.1 问题 2.2 分析与解决 根据题意,我们可以明白只需要从开始到结尾遍历这些罗马数字,如果发现前一个小于后一个

LeetCode 013 Roman to Integer

[题目] Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 to 3999. [题意] 把罗马数转换为整数 [思路] 罗马数字中只使用如下七个基值字母:M,D,C,L,X,V,I,分别用来表示1000.500.100.50.10.5.1. 大体思路是每个罗马字母对应的值相加即可, 但需要处理900, 400, 90, 40, 9, 4这几个特殊值(左

leetCode 13. Roman to Integer 字符串

13. Roman to Integer Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 to 3999. 补充:罗马数字 罗马数字共有七个,即I(1),V(5),X(10),L(50),C(100),D(500),M(1000).按照下面的规则可以表示任意正整数. 重复数次:一个罗马数字重复几次,就表示这个数的几倍. 右加左减:在一个较大的罗马数

Roman to Integer——罗马数字转变算法

本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/41486885 通过本文你可能学到的知识如下: (1)理解本题的解题思路,在以后类似的场景中,如果没有想到比较好的方法,可以考虑使用本文的方法,虽然效率不是特别高. (2)能够对字符串的截取和HashMap相关操作有所学习. Roman to Integer Given a roman numeral, convert it to an integer. I

LeetCode之Integer to Roman, Roman to Integer

罗马数字以前只接触过I到VIII,第一次听说罗马数字也可以表示大于8的数字.阿拉伯数字和罗马数字之间的转换最重的是了解罗马数字的规则.Wiki了一把,又参考了其它的文档,总结如下: 罗马数字规则: 1, 罗马数字共有7个,即I(1).V(5).X(10).L(50).C(100).D(500)和M(1000). 罗马数字中没有"0". 2, 重复次数:一个罗马数字最多重复3次. 3, 右加左减: 在较大的罗马数字的右边记上较小的罗马数字,表示大数字加小数字. 在较大的罗马数字的左边记上