정수에 LeetCode_13 로마 숫자

제목 설명

I, V, X, L, C, D 및 M. : 다음의 7을 포함하는 로마 숫자 문자

문자 수치
나는 1
V 5
엑스 (10)
(50)
(100)
(500)
미디엄 1,000
罗马数字 2 写做 II ,即为两个并列的 1。
12 写做 XII ,即为 X + II 。
27 写做  XXVII, 即为 XX + V + II 。

일반적으로 많은 수의 오른쪽에 로마 숫자의 작은 숫자. 그러나 예외는 특별한 규칙은 다음과 육가지 경우에만 적용이 있습니다 :

  • I 왼쪽 V (5), X (10)에있을 수 있고,도 4 및도 9를 나타내는.
  • X L은 왼쪽 (50) 및 C (100)에 배치 될 수 있고, (40) 및 (90)는 표현된다. 
  • C는 400, 왼쪽 D (500)와 M (1000)에 배치 될 수 있고 (900)은 나타낸다.

정수로 변환, 로마 숫자를 감안할 때. 입력이 1 내지 3999의 범위에 있도록한다.

입력 : "III"
출력 : 3

입력 : "IV"
출력 : 4

입력 : "IX"
출력 : 9

입력 "LVIII"
출력 : 58
설명 : L = 50, V = 5 , III = 3.

입력 : "MCMXCIV"
출력 : 1,994
명 : M = 1000, CM = 900 , 90 = XC, IV = 4.

지식 포인트

  • 로마 숫자
  • 사전
  • 해시 테이블
  • 문자열 문자열

해시 테이블 / 스위치

데이터는 그 키 (열쇠)와 값 (값)로 기억된다.

string.at (I)

i 번째 비트 문자열을 얻을 수있다

string.size (문자열)

문자열 크기를 얻을 수있다

해결

아이디어는 작은 상처를 왼쪽 큰 플러스를 남겨

规则:
罗马数字由 I,V,X,L,C,D,M 构成;
当小值在大值的左边,则减小值,如 IV=5-1=4;
当小值在大值的右边,则加小值,如 VI=5+1=6;
由上可知,右值永远为正,因此最后一位必然为正。
一言蔽之,把一个小值放在大值的左边,就是做减法,否则为加法。

알고리즘 과정

  • 1. 입력이 유효한 로마 단어라고 가정
  • (2) 전달 함수 : I, V, X, L, C, D, M은 대응하는 디지털 로마 숫자
  • 3. 만약 상기 제 로마 숫자 <제 로마 숫자 (호 전환 기능), 합계
  • 4. 만약 제 로마 숫자> 제 로마 숫자 (호 전환 기능), 감산
  • 5. 반환 결과를 얻을

코드

//C++
#include <iostream>
#include<string>
using namespace std;
class Solution {
public:
    int romanToInt(string s) {//输入的是字符串
        int sum = 0;//sum记录当前右值
        int prenum = getValue(s.at(0));//字符串的第一个字符转换成数字,用prenum记录左值
        for (int i = 1; i < s.size(); ++i) {//string size()返回字符串大小,每次循环处理prenum
            int postnum = getValue(s.at(i));//用postnum记录右值
            if (postnum > prenum) //如果小值在左边prenum,sum-左值
                sum -= prenum;
          
            else//如果小值在右边,sum+左值
                sum += prenum;
            prenum = postnum;//比较完相邻两个字符的大小后,把sum赋值给prenum,作为下一次比较的左值
        }
        sum += prenum;//最后一次跳出循环的时候,把最后一个postnum赋值给了prenum,所以最后sum还要加上prenum
        return sum;

    }

//函数需要设置为public???
    int getValue(char ch) {//对每一个字符进行转换成数字
        switch (ch) {
        case 'I': return 1;
        case 'V': return 5;
        case 'X': return 10;
        case 'L': return 50;
        case 'C': return 100;
        case 'D': return 500;
        case 'M': return 1000;
        default: return 0;
        }
    }

};

int main() {
    Solution solution;
    string c1 = "IXX";
    string c2 = "IV";
    string c3 = "LVIII";
    string c4 = "MCMXCIV";
    cout << solution.romanToInt(c1) << endl;
    cout << solution.romanToInt(c2) << endl;
    cout << solution.romanToInt(c3) << endl;
    cout << solution.romanToInt(c4) << endl;
}


추천

출처www.cnblogs.com/zhuomoyixia/p/12403608.html