Leetcode——罗马数字和阿拉伯数字的转换

说实话,这两道在leetcode上标记为中等和简单的题却让我蛋疼了半天。可能是因为先天对阿拉伯数字不熟悉的关系,所以在做两道题的居然没有一点感觉!!!!!

将罗马数字转化为阿拉伯数字比较简单:从左向右扫描整个字符串既可,只有在前一个数字比后一个数字小的时候需要做特殊处理(需要做减法)。

class Solution 
{
public:
	int romanToInt(string s)
	{
		if (s.empty())
		{
			return 0;
		}
		int letter[256];
		for (int i=0; i<256; i++)
		{
			letter[i] = 0;
		}
		letter[‘I‘] = 1;
		letter[‘V‘] = 5;
		letter[‘X‘] = 10;
		letter[‘L‘] = 50;
		letter[‘C‘] = 100;
		letter[‘D‘] = 500;
		letter[‘M‘] = 1000;

		int result = 0;
		unsigned int cur = 0;
		unsigned int next = 1;
		while (next < s.size())
		{
			if (letter[s[cur]] < letter[s[next]])
			{
				result = result + (letter[s[next]] - letter[s[cur]]);
				cur = cur + 2;
				next = next + 2;
			}else{
				result = result + letter[s[cur]];
				cur = cur + 1;
				next = next + 1;
			}
		}
		if (cur < s.size())
		{
			result = result + letter[s[cur]];
		}

		return result;
	}
};

将阿拉伯数字转化为罗马数字就有些蛋疼了。。。。但是看了leetcode上投票最高的一个方法后恍然大悟,原来也只需要将千位,百位,十位等等表示出来既可。

class Solution {
public:
    string intToRoman(int num) {
        string result = "";
        if (num < 1 || num > 3999)
        {
            return result;
        }
        string M[] = {"", "M", "MM", "MMM"};    //千位,从1000到3000
        string C[] = {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"};  //百位,从100到900
        string X[] = {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"};  //十位,从10到90
        string I[] = {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"};  //个位,从1到9
        result = M[num / 1000] + C[(num % 1000) / 100] + X[(num % 100) / 10] + I[num % 10];
    }
};
时间: 2024-10-03 05:57:58

Leetcode——罗马数字和阿拉伯数字的转换的相关文章

58. 分析、测试与总结:罗马数字和阿拉伯数字的转换[roman to integer and integer to roman in c++]

[本文链接] http://www.cnblogs.com/hellogiser/p/roman-to-integer-and-integer-to-roman.html [题目] 给出一个罗马数字,转换为阿拉伯数字.本题只考虑3999以内的数. 罗马数字有如下符号: Ⅰ(1)Ⅴ(5)Ⅹ(10)L(50)C(100)D(500)M(1000) 计数规则: (1).若干相同数字连写表示的数是这些罗马数字的和,如III=3: (2).小数字在大数字前面表示的数是用大数字减去小数字,如IV=4: (3

[leetcode]罗马数字和阿拉伯数字相互转换

罗马转阿拉伯 public int romanToInt(String s) { /* 从左到右依次根据哈希表进行加法 如果是"CM"900这种情况就要执行+M和-C处理 */ if (s.length()==0) return 0; Map<Character,Integer> map = new HashMap<>(); map.put('I', 1); map.put('V', 5); map.put('X', 10); map.put('L', 50);

LeetCode 13.Roman to Integer 罗马数字转阿拉伯数字

对于罗马数字转阿拉伯数字切入点有两个: 1.小数字出现在大数字前面只能使用一个(例如IV正确,IIV就是错误的) 2.除了情况1之外直接使用累加就ok 1 public int romanToInt(String s){ 2 if(s.length() < 1){ 3 return 0; 4 } 5 int result = 0; 6 for(int i=0;i<s.length();i++){ 7 result += getRomanValue(s.charAt(i)); 8 if(i<

罗马数字转阿拉伯数字

罗马数字转阿拉伯数字 1.罗马数字是位置计数吗?它的缺点是什么? 答:罗马数字不是位置技术,他的缺点:书写困难,规则繁杂,没有数字0 罗马数字包含以下七种字符:I, V, X, L,C,D 和 M.(python) 字符          数值 I             1 V             5 X             10 L             50 C             100 D             500 M             1000 2.将学号2

罗马数字与阿拉伯数字相互转换

罗马数字规则简明 1. 罗马单个数字共有7个,即I(1).V(5).X(10).L(50).C(100).D(500)和M(1000)2.一个罗马数字重复几次,就表示这个数的几倍.但同一数码不能出现三次以上.3.遵循右加左减的规则.左减的数字有限制,仅限于I.X.C.比如45不可以写成VL,只能是XLV但是,左减时不可跨越一个位数.比如,99不可以用IC(100 - 1)表示,而是用XCIX([100 - 10] + [10 - 1])表示.(等同于阿拉伯数字每位数字分别表示.)左减数字必须为一

罗马数字转为阿拉伯数字

1 /* I:1 ; V-5;X-10;L-50;C-100;D-500;M-1000*/ 2 class Solution{ 3 vector<string> tokens; 4 vector<char> token_value; 5 public: 6 /*divide the string into some tokens,every token including same char*/ 7 void token(string s) 8 { 9 string::iterat

[LeetCode]Word Ladder 最短距离字符串转换 (Dijkstra)

要求最短距离.采纳dijkstra查找节点之间的最短路径. 当心:假设是一个枚举字典22是否元素可以,如果转换,暂停. 提高:每串,带您历数它的字符值事件,对于的长度n一个字符串枚举n*26次要. 设仅仅是简单的枚举,则会出现重边: 如abc,bbc,cbc,建图后每两个节点间均有两条双向边,这对于邻接表存储的图会存在非常多冗余边. 解决方法:每一个节点每位字符仅仅能从原始字符往后枚举,即 枚举各字符串第一位的话 abc:bbc,cbc,dbc,... bbc:cbc,dbc,... cbc:d

[LeetCode]7. ZigZag Conversion ZigZag转换

The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like this: (you may want to display this pattern in a fixed font for better legibility) P A H NA P L S I I GY I R And then read line by line: "PAHNAPLSIIGY

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. 题目分析:罗马数字向阿拉伯数字的转换情况如下: 1.M=1000 D=500 C=100 L=50 X=10 V=5 I=1 2.若小的罗马符号出现在大的罗马符号的前面,则小的罗马符号代表的数字改为负.这种情况只能出现有限的情况. 因此目前想到两种方法. 第一种方法是再扫