主題の要件
コード:数千、数百、数十、1が順番に処理されます
class Solution {
public:
map<int,string> m;
string intToRoman(int num) {
string roman;
//存储数字各个位(个位、十位、百位)上的数
int bitNumber;
mapInit();
bitNumber = num / 1000;
strRomanFun(roman, bitNumber, 1000);
num %= 1000;
bitNumber = num / 100;
strRomanFun(roman, bitNumber, 100);
num %= 100;
bitNumber = num / 10;
strRomanFun(roman, bitNumber, 10);
num %= 10;
bitNumber = num / 1;
strRomanFun(roman, bitNumber, 1);
num %= 1;
return roman;
}
void mapInit()
{
m[1] = "I";
m[4] = "IV";
m[5] = "V";
m[9] = "IX";
m[10] = "X";
m[40] = "XL";
m[50] = "L";
m[90] = "XC";
m[100] = "C";
m[400] = "CD";
m[500] = "D";
m[900] = "CM";
m[1000] = "M";
}
void strRomanFun(string& Roman, int bitNumber, int bit)
{
if (bitNumber == 4)
{
Roman += m[4 * bit];
}
else if (bitNumber == 9)
{
Roman += m[9 * bit];
}
else
{
if (bitNumber / 5)
{
Roman += m[5 * bit];
}
for (size_t i = 0; i < (bitNumber%5); i++)
{
Roman += m[bit];
}
}
}
};
事前に設計された
3つの関数すべてがマップに簡単にアクセスできるように、メンバー変数マップがクラスで定義されています。
サブ関数関数mapInitは、マップ
サブ関数関数strRomanFunの初期化を担当し、文字列をビットごとに追加します。
全体のアイデア
まず、数字と対応するローマ字を格納するマップを定義します。
次に、数千、数百、数十、1の順序でローマ字の変換を実行します。
- このビットの数が0に等しい場合は、このビットをスキップしてください
- このビットの数値が0より大きく4より小さい場合は、文字列の後にビット「1値」の対応する数値を追加します。
- このビットの数が4に等しい場合は、文字列の後にこのビットの「4値」を追加します。
- このビットの数値が4より大きく9より小さい場合は、このビットの「5値」と、文字列の後に残りの「1値」を追加します。
- このビットの数が9に等しい場合は、文字列の後にこのビットの「9値」を追加します。
例として1994を取り上げ
ます。文字列は最初は空です。
1つ目は千の位の数字1です。1は0より大きく4未満であるため、千の位の「1値」を文字列の後に追加する必要があります。つまり、「M」です。「M」
次は百桁の数字9で、文字列の最後に百桁の「9値」が追加されます。これは900の「CM」です。「MCM」
次は10の位の数字0で、文字列の最後に10の「9値」が追加されます。これは90の「XC」です。「MCMXC」
最後は1桁の数字4で、1桁の「4値」が文字列の最後に追加されます。これは4の「IV」です。「MCMXCIV」
学んだこと
1.マップに要素を挿入する方法を再学習しました
- インサート付きインサートペア
- 挿入でvalue_typeを挿入します
- 配列メソッドを使用する
m[1] = "I";
この質問では、3番目の方法を使用しましたが、マップに値がある場合、この方法は古い値を上書きすることに注意してください。