题目描述
解题
思路:①用给的数去除每个罗马字母代表的数,能除到则表示有一个 该字符
②需考虑到6中特殊情况“IV”、“IX”、“XL”、“XC”、“CD”、“CM”
public string IntToRoman(int num) {
int[] n = new int[]{1000,900,500,400,100,90,50,40,10,9,5,4,1};
int[] R = new int[n.Length];
string[] Ro = new[] {"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I" };
StringBuilder Roman = new StringBuilder("");
for (int i = 0; i < n.Length; i++)
{
R[i] = num / n[i];
num = num % n[i];
while(R[i]>0)
{
Roman.Append(Ro[i]);
R[i]--;
}
}
return Roman.ToString();
}
以上为我自己写的代码,看过官方解题后引入知识点:贪心算法
下为改进后代码:
public string IntToRoman(int num) {
int[] n = new int[]{1000,900,500,400,100,90,50,40,10,9,5,4,1};
string[] Ro = new[] {"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I" };
StringBuilder Roman = new StringBuilder("");
for (int i = 0; i < n.Length && num>0; i++)
{
while(num>= n[i])
{
num -= n[i];
Roman.Append(Ro[i]);
}
}
return Roman.ToString();
}
较官方解题优点:内存占用低。
原因:①使用StringBuilder对象;
②该对象使用,拼接等不创建新的对象,只在tostring()时创建一个对象
③使用string拼接或者修改每次都创建一个对象
⑤字符串string一旦被创建就不能被修改