1. 程式人生 > >【C++】將羅馬數字轉換成阿拉伯數字

【C++】將羅馬數字轉換成阿拉伯數字

題目:Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
將羅馬數字轉換成阿拉伯數字。
方法一:
從前往後的計算,規則如下:1,小的數字在大的數字的右邊,所表示的數等於這些數字相加得到的數
2,小的數字(限於 Ⅰ、X 和 C)在大的數字的左邊,所表示的數等於大數減小數得到的數

程式碼如下:

int romanToInt(string s) {
    map<char,int> saluota{{'I'
,1},{'V',5},{'X',10},{'L',50},{'C',100},{'D',500},{'M',1000}}; int length = s.length(); if(length==1) return saluota[s[0]]; int i=0,temp,sum=0; while(i<length){ if(saluota[s[i]] < saluota[s[i+1]] ){ temp=saluota[s[i+1]]-saluota[s[i]]; i+=2; } else
{ temp=saluota[s[i]]; i++; } sum+=temp; if(i+2>=length) break; } if(saluota[s[i]] < saluota[s[i+1]]){ sum+=saluota[s[i+1]]-saluota[s[i]]; } else sum+=saluota[s[i+1]]+saluota[s[i]]; return sum; }

弊端:實現比較複雜,而且有當x=”IX”的時候,在CodeBlocks下面輸出是9,但是在LeedCode下面輸出是109,很奇怪。

方法二:從後往前計算,若是後一個比前一個小,那麼就sum直接加上,若是後一個比前一個小,那麼大數減小數之後在sum加上。
程式碼如下:

int romanToInt2(string s) {
    map<char,int> saluota{{'I',1},{'V',5},{'X',10},{'L',50},{'C',100},{'D',500},{'M',1000}};
    int length=s.length();
    if(length==1)
       return saluota[s[0]];
    int i=0,sum=saluota[s[length-1]];
    for(i=length-2;i>=0;i--){
       if(saluota[s[i]]>=saluota[s[i+1]])
          sum+=saluota[s[i]];
       else
          sum-=saluota[s[i]];
     }
    return sum;
}

Leetcode上通過了。
優點點是很程式碼簡潔,也比較容易計算。但是缺點是不容易想到。不知道如何復現,可能下次同類型的題目還是不知道用這種方法。

相關推薦

C++羅馬數字轉換阿拉伯數字

題目:Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 to 3999. 將羅馬數字轉換成阿拉伯數字。 方法

羅馬數字轉換阿拉伯數字

// 1. 可以同時處理最簡和非最簡的羅馬數字 // 2. 不處理加橫線擴大1000倍的情況,也就是最大隻處理"M" // 3. 不作合法性檢查,如"L"不能出現在"C"前面 int Digit(char c) { if (c == 'I') {

漢字數字字符串轉換阿拉伯數字

weight class har spa 數字 null 轉換 bold blog 1 declare 2 3 str_mid varchar2(100); 4 str_end varchar2(100); 5 begin 6 7 for j in

sql float 轉換為資料型別 numeric 時出現算術溢位錯誤

sql中float型別的取值範圍? 大於9999999999的情況下,就會報錯將 float 轉換為資料型別 numeric 時出現算術溢位錯誤   insert into[dbo].[T_DATA_DISEASE](STATIONCODE,MONIDATE,RATE,STYL

HTML5封裝android應用APK 檔案若干方法

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

c#:無法 NULL 轉換“System.DateTime”,因為它是一種值型別

摘自:http://www.blogjava.net/parable-myth/archive/2010/09/30/333454.html 在C# 2.0裡面的資料型別中,分為值型別和引用型別,引用型別可以初始化為null,可是值型別是不可以的。 比如經常用到的System.Guid型別,要麼賦值為Gu

給定一個羅馬數字 ss,羅馬數字轉換整數。

給定一個羅馬數字 s,將羅馬數字轉換成整數。 如羅馬數字I,II,III,IV,V分別代表數字 1, 2, 3, 4, 5。 首先要來了解一下羅馬數字表示法,基本字元有 7 個:I、V、X、L、C、D、M,分別表示1、5、10、50、100、500、1000。 在構成數字的時

C#之里氏轉換

前面說到了繼承,子類可以繼承父類的屬性和方法,但是父類也有自己特有的子類不能用的屬性和方法,當子類想要呼叫父類中的一些特有的屬性或方法是,就用到了里氏轉換,即將子類通過轉換變成父類,使用父類中的特有屬性和方法後在返回為子類。 #一、里氏轉換可能出現的四種情況 ##1、 //如果n

演算法把字串轉換整數,樹中兩個結點的最低公共祖先

本書最後的兩道題,作者拿了兩個面試案例來呈現,主要是要弄清面試官的意圖、考慮周全,有些演算法雖然容易,不要輕易下手。在此之上最好寫出具有魯棒性的和好的擴充套件性的程式碼,遵循編碼規範。 面試題67:把字串轉換成整數 請你寫一個函式StrToInt,實現把字串轉

C#三種轉換字元法、三元表示式、常量列舉結構和陣列

一、三種方法轉換字串變成數字 1.1.Parse的使用 這兩個使用結果一樣,當用戶輸入的數字轉換成我們想要的數字型別。 可以使用     Convert.ToInt32(""); 還可以使用  int.Parse("") 1.2.int.TryParse的使用

C#_時間轉換字串的幾種方法

//獲取當前系統時間 DateTime dt = System.DateTime.Now; //將系統時間轉換成字串 string strTime

C++結構作為引數傳遞並返回

#include"iostream.h" #include"stdio.h" #include"string.h" struct Date { int day,month,year; }; Dat

C語言字串轉換對應的數字(十進位制、十六進位制)

問題1:講一個十進位制數字的字串表示轉換成對應的整數。舉例:將“1234”轉換成整數1234./*將字串s轉換成相應的整數*/ int atoi(char s[]) { int i = 0; int n = 0; for (i =

字串中的中文數字轉換阿拉伯數字

1、正則表示式的處理工具類 public class RexUtils { public static String and(String... rules) { St

Android圖片轉換為圓角

摘自:https://github.com/NashLegend/SourceWall.git import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.

LeetCode試題--羅馬數字轉換整數

題目描述如下:    通過分析題目邏輯,羅馬數字使用Map儲存,呼叫String的CharAt方法提取字串中的特定位置字元。 map.get(Object key):獲取給定key對應的值; char CharAt(int index):取字串中存放在index位置的

C++txt檔案中的內容讀入動態二維陣列內

這篇主要記錄一下使用C++中的動態二維陣列來儲存讀入的txt文件中的資料 //設txt中的資料有rows行和cols列 //使用new新建一個rows行,cols列的二維陣列fstream fin

實用把jar轉換exe檔案

上課後寫部落格的時間就少了,趁著清明假期把之前學到的一些東西整理一下~之前由於專案需要爬取很大的資料量,在機房用了多臺電腦去爬取資料,但是很麻煩的一點就是得“搬”程式碼還要進行相應的配置,後來瞭解到jar轉exe的做法感覺很便利~接下來就和大家分享一下>_

羅馬數字轉換阿拉伯數字

這篇帖子我提供了一個將幾千以內的羅馬數字,轉換成阿拉伯數字的JS方法。 對於這種轉化,我認為只要注意羅馬數字的兩個特性: 1.連寫的數字重複不得超過三次,比方說要表示4,就不能是IIII,而應該是IV 2.如果小的數字,它在大的數字的左邊,那麼它所表示的數等於大數減小數得到

字串轉換十進位制數字

         這兩天做的一個專案需要將十進位制字串(只含'0'--'9' )轉換成相應的數字。比如將“123456789”轉換成數字123456789。要求只轉換指定長度而不是轉換到字串的結束‘\0’。在網上搜到了比如StrToInt()等都是處理字串到字串結束而且不知