Roman zu Integer - Aber mit einem "anderen" römischen Zahlensystem

8

Ich hatte ein Interview, in dem ich furchtbar war. Also, jetzt versuche ich die Lösung für die Frage zu finden. Hier ist die Interviewfrage:

"Wir haben folgendes Mapping:
M: 1000, D: 500, C: 100, L: 50, X: 10, V: 5, I: 1.

Und wir haben die folgenden Regeln:

  1. Jeder Buchstabe wird einem positiven ganzzahligen Wert zugeordnet

  2. Sie fügen die Werte zusammen hinzu, außer ...

  3. ... Wenn einem Wert (oder Läufen mit den gleichen Werten) ein größerer Wert folgt, subtrahieren Sie die Summe dieser Werte.

Beispiele:

IIX - & gt; 8

MCCMIIX - & gt; 1808

Wir haben diese Java Methode: int valueOfRoman(char roman) . Wir haben die Java-Methode implementiert: int romanToInt(String s) "

Ich weiß, dass es kein richtiges römisches Zahlensystem ist, aber das ist die eigentliche Frage.

Ich konnte eine funktionierende Lösung für ein richtiges römisches System kodieren. Aber ich kann es nicht ändern, so dass es sich an diese neuen Regeln anpasst, besonders an Regel 3. Ich habe es versucht, aber ohne Erfolg. Die Art, wie meine Lösung jetzt ist, für IIX, druckt 10 statt der richtigen Antwort von 8. Hier ist mein Code (ich habe auch valueOf für meine Tests implementiert):

%Vor%

Jede Hilfe wird sehr geschätzt. Besonders nützlich wäre, wenn Sie mir sagen können, wie ich meinen Code ändern kann. Danke!

BEARBEITEN: Ich habe die Namen der Methoden so bearbeitet, dass sie klarer sind.

    
user224567893 13.03.2015, 16:24
quelle

6 Antworten

2

Mein Take - funktioniert mit den zugegebenermaßen kleinen Tests, die Sie geliefert haben.

%Vor%

druckt

%Vor%     
OldCurmudgeon 13.03.2015, 17:01
quelle
1

So würde ich das Problem angehen:

  • Lesen Sie die Zeichenfolge Zeichen für Zeichen und notieren Sie bei jedem Schritt das aktuelle Zeichen und das vorherige Zeichen .
    • Wenn das aktuelle Zeichen das gleiche wie das vorherige Zeichen ist, erhöhen Sie die Lauflänge um 1.
    • Wenn das aktuelle Zeichen einen kleineren Wert als das vorherige Zeichen aufweist, fügen Sie Lauflänge * Wert des vorherigen Zeichens zu gesamt hinzu und setzen Sie es zurück Lauflänge bis 1.
    • Wenn das aktuelle Zeichen einen höheren Wert als das vorherige Zeichen aufweist, subtrahieren Sie Lauflänge * Wert des vorherigen Zeichens von gesamt und setzen Sie es zurück Lauflänge bis 1.
biziclop 13.03.2015 16:41
quelle
1

Also, niemand hat meinen Hinweis verstanden. Dann werde ich es auch versuchen. Ich werde nicht auf die "IVX" -Dinge eingehen, weil ich das für einen Syntaxfehler halte.

%Vor%

Mal sehen: IIX

%Vor%

MCCMIIX

%Vor%

Die Methode lässt zur Kürze die Eingabevalidierung aus. Ich gehe davon aus, dass alle Eingaben überprüft wurden und nur aus erlaubten Zeichen gemäß "den Regeln" bestehen.

    
Fildor 13.03.2015 22:13
quelle
0

Ich nehme es an.

EDIT CHANGE # 2

%Vor%

Und die Hauptsache renne ich:

%Vor%

Ausgaben:

%Vor%     
gtgaxiola 13.03.2015 17:00
quelle
0

So habe ich es gemacht.

Es funktioniert für die zwei Werte, die Sie erwähnten (IIX = 8 und MCCMIIX = 1808):

%Vor%

EDIT 1:

Erklärung für "IVX" -Wert:

  

"... addieren Werte zusammen, außer wenn ein Wert (oder Läufe von SAME   Werte) folgt ein größerer Wert, Sie subtrahieren die Summe davon   Lauf der Werte. "

%Vor%

Also ist die Antwort für IVX 14!

    
Christian 13.03.2015 17:04
quelle
-2

Diese Art von Problematiken sind normalerweise sehr einfach zu lösen, indem man rekursives Denken anwendet. Die Lösung könnte so aussehen:

%Vor%

Selbst wenn eine rekursive Lösung verboten ist, ist es für mich einfacher, diesen Algorithmus zu rekursiv zu machen, als den prozeduralen Algorithmus auf Anhieb zu finden =)

Bearbeiten: Meine Ergebnisse:

  

Wert von MCCMIIX ist: 1808

     

Wert von IIX ist: 8

     

Wert von IVX ist: 4

     

Wert von IIVVL ist: 38

    
A. Ocannaille 13.03.2015 16:55
quelle