LetCode 13 Roman to Integer(로마 정수)
, 。
1 3999 。
원문
Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
처음부터 구상을 못했고 지난 문제대로 갈 수 있었지만 결과는 내 밑에서처럼.. 코드가 엉망진창이었어...
public class Solution
{
public int RomanToInt(string s)
{
int result = 0;
Type R = typeof(Roman);
string first, second;
if (s.Length > 1)
{
first = s.Substring(0, 1); second = s.Substring(0, 2);
}
else
{
first = s.Substring(0, 1); second = "";
}
foreach (var r in Enum.GetNames(R).Reverse())
{
while ((r.Length == 1 && first == r) || (r.Length == 2 && second == r))
{
result += int.Parse(Enum.Format(R, Enum.Parse(R, r), "d"));
int lenR = r.Length, lenS = s.Length;
if (lenS - lenR < 1)
s = "";
else
s = s.Substring(lenR, lenS - lenR);
if (s.Length > 1)
{
first = s.Substring(0, 1); second = s.Substring(0, 2);
}
else if (s.Length == 1)
{
first = s.Substring(0, 1); second = "";
}
else
{
first = ""; second = "";
}
}
}
return result;
}
}
public enum Roman
{
M = 1000,
CM = 900,
D = 500,
CD = 400,
C = 100,
XC = 90,
L = 50,
XL = 40,
X = 10,
IX = 9,
V = 5,
IV = 4,
I = 1
};
비록 운행할 수 있지만...... 효율도 너무 낮아서 똑바로 볼 수가 없어...그래서 다른 신들처럼 공부를 했어요...
아래의 코드는 나를 깊이 감동시켰다. 수조는 수조의 색인으로서... 내가 가장 자주 사용하지 않는 용법이다.
class Solution {
public:
int romanToInt(string s) {
unordered_map<char, int> map = {{'I', 1}, {'V', 5}, {'X', 10}, {'L', 50}, {'C', 100}, {'D', 500}, {'M', 1000}};
int ret = 0;
for (int idx = 0; idx < s.size(); ++idx) {
if ((idx < s.size()-1) && (map[s[idx]] < map[s[idx+1]])) {
ret -= map[s[idx]];
}
else {
ret += map[s[idx]];
}
}
return ret;
}
};
이 알고리즘은 로마 숫자 두 숫자의 전후 순서의 관계를 충분히 이용했다. 즉, I가 V 앞에 있으면 IV이고 4를 대표하며 반대로 6을 대표한다.C++의 unorderedmap, 교묘하게 수조를 통해 판단하여ret에 대한 가감 또는 감축의 목적을 달성할 수 있다.
잘 느껴야겠어..
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
python 문자열 입력으로 모든 유효한 IP 주소 생성(LeetCode 93번 문제)이 문제의 공식 난이도는 Medium으로 좋아요 1296, 반대 505, 통과율 35.4%를 눌렀다.각 항목의 지표로 말하자면 보기에는 약간 규범에 맞는 것 같지만, 실제로도 확실히 그렇다.이 문제의 해법과 의도는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.