Algorithm
这周刷了两个有联系的算法题,一个是罗马文字转数字一个是数字转罗马文字。
Integer to Roman(数字转罗马字)
罗马字和数字对照表:
Symbol | Value |
---|---|
I | 1 |
V | 5 |
X | 10 |
L | 50 |
C | 100 |
D | 500 |
M | 1000 |
当然有特殊情况需要处理:
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.
这些特殊情况主要集中在遇到4和9的时候,例如:4 不是 IIII,而是表示为 IV,从顺序上看为5减1;相应的 9 不是 VIIII,而是 IX。40,90,400,900也是类似的情况。
几个测试用例:
Input: 3 Output: “III”
Input: 4 Output: “IV”
Input: 9 Output: “IX”
Input: 58 Output: “LVIII”
Input: 1994 Output: “MCMXCIV”
默认输入值的为int类型,范围为 1 到 3999.
代码:
public static string IntToRoman(int num)
{
string result = "";
int number = num / 1000;
if (number > 0)
{
while (number>0)
{
result += "M";
number--;
}
}
number = num % 1000 / 100;
if (number > 0)
{
if (number == 4)
{
result += "CD";
}
else if (number == 9)
{
result += "CM";
}
else
{
if (number >= 5)
{
result += "D";
number -= 5;
}
while (number > 0)
{
result += "C";
number--;
}
}
}
number = num % 100 / 10;
if (number > 0)
{
if (number == 4)
{
result += "XL";
}
else if (number == 9)
{
result += "XC";
}
else
{
if (number >= 5)
{
result += "L";
number -= 5;
}
while (number > 0)
{
result += "X";
number--;
}
}
}
number = num % 10;
if (number > 0)
{
if (number == 4)
{
result += "IV";
}
else if (number == 9)
{
result += "IX";
}
else
{
if (number >= 5)
{
result += "V";
number -= 5;
}
while (number > 0)
{
result += "I";
number--;
}
}
}
return result;
}
我这从千位开始判断,感觉有点奇怪,我也不知道当时是怎么想的。
再贴出来 罗马字转数字 的代码:
static public int RomanToInt(string s)
{
int result = 0;
Dictionary<char, int> dic_str = new Dictionary<char, int>() { { 'I', 1 }, { 'V', 5 }, { 'X', 10 }, { 'L', 50 }, { 'C', 100 }, { 'D', 500 }, { 'M', 1000 } };
for(int i=0;i<s.Length;i++)
{
result += dic_str[s[i]];
if (i>0 && dic_str[s[i]]> dic_str[s[i-1]])
{
result -= 2 * dic_str[s[i - 1]];
}
}
return result;
}
写完这两段代码以后,觉得数字转罗马字有新的思路,直接把每位数字对应的罗马字建立一张查询表,直接解析数字的每一位,发现速度也一般,至少比我预想的要慢:
public string IntToRoman(int num) {
string[,] intToRomanArray = {
{"I","II","III","IV","V","VI","VII","VIII","IX"},
{"X","XX","XXX","XL","L","LX","LXX","LXXX","XC"},
{"C","CC","CCC","CD","D","DC","DCC","DCCC","CM"},
{"M","MM","MMM","","","","","",""}
};
string result = "";
for(int i=0;i<4;i++)
{
int temp = num%10;
if(temp>0){
result = intToRomanArray[i,temp-1]+result;
}
if(num/10>0){
num = num/10;
}else{
break;
}
}
return result;
}
看了下,执行速度比我快的代码,思路也类似,没太搞懂。也贴出来看下吧。
public class Solution {
public string IntToRoman(int num) {
string ans = "";
int place = 0;
while(num > 0)
{
int digit = num%10;
ans = GetRomanNumberByPlace(digit,place) + ans;
place += 1;
num = num/10;
}
return ans;
}
private string GetRomanNumberByPlace(int number, int place)
{
if(place == 0)
{
string[] UnitsPlace = new string[]{"","I","II","III","IV","V","VI","VII","VIII","IX"};
return UnitsPlace[number];
}
if(place == 1)
{
string[] TensPlace = new string[]{"","X","XX","XXX","XL","L","LX","LXX","LXXX","XC"};
return TensPlace[number];
}
if(place == 2)
{
string[] HundredsPlace = new string[]{"","C","CC","CCC","CD","D","DC","DCC","DCCC","CM"};
return HundredsPlace[number];
}
else
{
string[] ThousandsPlace = new string[]{"","M","MM","MMM"};
return ThousandsPlace[number];
}
}
}
Review
空缺,五一以后一定要续命啊。
Tips&Share
短长假没能如期完成任务啊,这是要加班的前奏啊,Vue的初步学习经历下周要完工了,一定要提高文章质量。