ARTS-第7周-190429

Algorithm
这周刷了两个有联系的算法题,一个是罗马文字转数字一个是数字转罗马文字。
Integer to Roman(数字转罗马字)
罗马字和数字对照表:

SymbolValue
I1
V5
X10
L50
C100
D500
M1000

当然有特殊情况需要处理:
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的初步学习经历下周要完工了,一定要提高文章质量。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值