题解 | #牛牛和罗马数字智力游戏#
牛牛和罗马数字智力游戏
https://www.nowcoder.com/practice/7f4bd3b2d7d34f5c87d84120d9782c1d
考察的知识点:哈希;
解答方法分析:
roman_characters
保存了罗马数字字符的对应关系。数组的每一行表示一个数字位上对应的字符,第一列表示该数字位上的普通字符,第二列表示该数字位的特殊字符。- 通过循环将整数
num
从高位到低位进行处理。在每一循环中,首先计算整数num
除以当前数位的进位值magnitude
,得到商quotient
。根据商的不同取值,将罗马数字字符添加到结果字符串result
中。 - 如果商小于等于3,将普通字符连续添加quotient次;如果商等于4,添加一个普通字符和一个特殊字符;如果商大于等于5且小于等于8,先添加一个特殊字符,再连续添加商减去5次普通字符;如果商等于9,添加一个普通字符和一个上一个数位上的普通字符。
- 接下来,将
num
取余magnitude
,更新magnitude
为下一个数位的进位值。同时,更新roman_char_index
为下一个数位的索引。如果结果字符串result
的长度达到了限制长度limit
,则将结果字符串进行反转。 - 最后,返回结果字符串
result
。
所用编程语言:C++;
完整编程代码:↓
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param num int整型 * @param limit int整型 * @return string字符串 */ string integerToRomanWithReverse(int num, int limit) { string roman_characters[4][2] = { {"M", ""}, {"C", "D"}, {"X", "L"}, {"I", "V"}, }; string result = ""; int magnitude = 1000; int roman_char_index = 0; while (num > 0) { int quotient = num / magnitude; if (quotient <= 3) { result += string(quotient, roman_characters[roman_char_index][0][0]); } else if (quotient == 4) { result += roman_characters[roman_char_index][0] + roman_characters[roman_char_index][1]; } else if (quotient <= 8) { result += roman_characters[roman_char_index][1] + string(quotient - 5, roman_characters[roman_char_index][0][0]); } else { result += roman_characters[roman_char_index][0] + roman_characters[roman_char_index - 1][0]; } num %= magnitude; magnitude /= 10; roman_char_index++; if (result.length() >= limit) { reverse(result.begin(), result.end()); } } return result; } };