由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - 罗马数字转换成十进制
相关主题
跪求roman number to integer 和 integer to roman number的程序LeetCode上的Integer to Roman和 Roman to Integer
amazon罗马数字变化的题是啥?如何判断string是valid roman数字
贡献个题盒子面经
问了3个设计题,2个coding题@L问一道前几天在版上看见的题
leetcode: integer to roman 结果不同a2z(amazon 子公司)电面题目
integer to roman的考点在哪里呢?好不容易写了个bug free, 可是被说会秒据, 帮看看
今天算是见到最精炼的Integer to Roman的解法了BB电面
这种题简直太恶心了!说个epic的机考题目
相关话题的讨论汇总
话题: int话题: return话题: num话题: string话题: ret
进入JobHunting版参与讨论
1 (共1页)
i***d
发帖数: 28
1
大牛们有谁写过罗马数字转换成十进制和十进制转换成罗马数字的啊?
能不能帮忙贴一下,写了一个下午,还是没有思路。先谢谢了!
p*****2
发帖数: 21240
2
import java.io.*;
import java.util.*;
public class Roman
{
public static void main(String[] args)
{
new Roman().run();
}
PrintWriter out = null;
void run()
{
Scanner in = new Scanner(System.in);
out = new PrintWriter(System.out);
String s = in.next();
out.println(romanToInt(s));
out.close();
}
public String intToRoman(int num)
{
StringBuffer sb = new StringBuffer();
sb.append(Convert(num, 1000, new char[]
{ 'M', 0, 0 }));
num %= 1000;
sb.append(Convert(num, 100, new char[]
{ 'C', 'D', 'M' }));
num %= 100;
sb.append(Convert(num, 10, new char[]
{ 'X', 'L', 'C' }));
num %= 10;
sb.append(Convert(num, 1, new char[]
{ 'I', 'V', 'X' }));
return sb.toString();
}
String Convert(int num, int base, char[] letters)
{
num /= base;
if (num == 0)
return "";
StringBuffer sb = new StringBuffer();
if (num == 9)
{
sb.append(letters[0]);
sb.append(letters[2]);
}
else if (num >= 5)
{
sb.append(letters[1]);
for (int i = 6; i <= num; i++)
sb.append(letters[0]);
}
else if (num == 4)
{
sb.append(letters[0]);
sb.append(letters[1]);
}
else
{
for (int i = 1; i <= num; i++)
sb.append(letters[0]);
}
return sb.toString();
}
HashMap hm = new HashMap();
void Init()
{
if (hm.size() == 0)
{
hm.put("I", 1);
hm.put("IV", 4);
hm.put("V", 5);
hm.put("IX", 9);
hm.put("X", 10);
hm.put("XL", 40);
hm.put("L", 50);
hm.put("XC", 90);
hm.put("C", 100);
hm.put("CD", 400);
hm.put("D", 500);
hm.put("CM", 900);
hm.put("M", 1000);
}
}
public int romanToInt(String s)
{
Init();
int ret = 0;
int i = 0;
while (i < s.length())
{
if (i + 1 < s.length() && hm.containsKey(s.substring(i, i + 2)))
{
ret += hm.get(s.substring(i, i + 2));
i += 2;
}
else
{
ret += hm.get(s.substring(i, i + 1));
i++;
}
}
return ret;
}
}
l*****a
发帖数: 14598
3
so long
不看

【在 p*****2 的大作中提到】
: import java.io.*;
: import java.util.*;
: public class Roman
: {
: public static void main(String[] args)
: {
: new Roman().run();
: }
: PrintWriter out = null;
: void run()

l*****a
发帖数: 14598
4
突然发现你怎么什么程序都弄一个.Run(0 method..

【在 p*****2 的大作中提到】
: import java.io.*;
: import java.util.*;
: public class Roman
: {
: public static void main(String[] args)
: {
: new Roman().run();
: }
: PrintWriter out = null;
: void run()

p*****2
发帖数: 21240
5

你多看看java吧。

【在 l*****a 的大作中提到】
: so long
: 不看

p*****2
发帖数: 21240
6

学的。呵呵。

【在 l*****a 的大作中提到】
: 突然发现你怎么什么程序都弄一个.Run(0 method..
w****x
发帖数: 2483
7
面试这题我直接投降, 罗马转阿拉伯数字的规律别说写程序, 我弄清楚都要花2小时
k*****y
发帖数: 744
8
从右往左读,每次看两位。如果右边大,就是差,不然就是和。
int getNumber(char c){
switch(c){
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;
}
return 0;
}
int romanToInt(string s) {
int pos = s.length()-1;
int sum = 0;
while(pos>=0){
int right = getNumber(s[pos]);
int left = INT_MAX;
if(pos)
left = getNumber(s[pos-1]);
if(left < right){
sum += right -left;
pos -= 2;
}
else{
sum += right;
--pos;
}
}
return sum;
}

【在 i***d 的大作中提到】
: 大牛们有谁写过罗马数字转换成十进制和十进制转换成罗马数字的啊?
: 能不能帮忙贴一下,写了一个下午,还是没有思路。先谢谢了!

k*****y
发帖数: 744
9
string intToRoman(int num) {
char Roman[] = {'I', //1
'V', //5
'X', //10
'L', //50
'C', //100
'D', //500
'M'}; //1000
string ans;
if(num >= 4000 || num <= 0) return ans;
stack digits;
while(num){
digits.push(num%10);
num/=10;
}
int offset=digits.size()*2-2;
while(digits.size()){
int lastDigit = digits.top();
digits.pop();
if(lastDigit == 4){
ans += Roman[offset]; //-1
ans += Roman[offset+1]; //5
}
else if(lastDigit == 9){
ans += Roman[offset]; //-1
ans += Roman[offset+2]; //10
}
else{
if(lastDigit >= 5)
ans += Roman[offset+1]; //5
for(int i=0; i ans += Roman[offset]; //1s
}
}
offset -= 2;
}
return ans;
}

【在 i***d 的大作中提到】
: 大牛们有谁写过罗马数字转换成十进制和十进制转换成罗马数字的啊?
: 能不能帮忙贴一下,写了一个下午,还是没有思路。先谢谢了!

S**I
发帖数: 15689
10
楼上的全是Java,俺来一个C的吧(各种exception懒得写了):
#include
int getDecimal(char);
int romanToDecimal(char *);
char getRoman(int);
char * decimalToRoman(int, char *);
int main(int argc, char* argv[]){
printf("Roman: %s\n", argv[1]);
int d = romanToDecimal(argv[1]);
printf("Decimal: %d\n", d);
char r[1000];
decimalToRoman(d, r);
printf("Roman: %s\n", r);
}
int getDecimal(char a){
switch(a){

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;
}
return 0;
}
int romanToDecimal(char * r){
int d1 = getDecimal(*r), d2 = getDecimal(*++r), d = 0;
while(1){
if(d1 >= d2){
d += d1;
}
else{
d -= d1;
}
if(d2 == 0){
break;
}
d1 = d2;
d2 = getDecimal(*++r);
}
return d;
}
char getRoman(int d){
switch(d){

case 1:
return 'I';
case 5:
return 'V';
case 10:
return 'X';
case 50:
return 'L';
case 100:
return 'C';
case 500:
return 'D';
case 1000:
return 'M';
}
return '\0';
}
char * digitToRoman(int digit, int base, char * r){
if(digit <= 3){
while(digit > 0){*r++ = getRoman(base); digit--;}
}
else if(digit == 4){
*r++ = getRoman(base);
*r++ = getRoman(5 * base);
}
else if(digit == 5){
*r++ = getRoman(5 * base);
}
else if(digit <= 8){
*r++ = getRoman(5 * base);
digit -= 5;
while(digit > 0){*r++ = getRoman(base); digit--;}
}
else if(digit == 9){
*r++ = getRoman(base);
*r++ = getRoman(10 * base);
}
return r;
}
char * decimalToRoman(int d, char * r){
int digit = d / 1000;
d %= 1000;
while(digit > 0){
*r++ = getRoman(1000);
digit--;
}
digit = d / 100;
d %= 100;
r = digitToRoman(digit, 100, r);

digit = d / 10;
d %= 10;
r = digitToRoman(digit, 10, r);
r = digitToRoman(d, 1, r);
*r = '\0';
return r;
}

【在 i***d 的大作中提到】
: 大牛们有谁写过罗马数字转换成十进制和十进制转换成罗马数字的啊?
: 能不能帮忙贴一下,写了一个下午,还是没有思路。先谢谢了!

相关主题
integer to roman的考点在哪里呢?LeetCode上的Integer to Roman和 Roman to Integer
今天算是见到最精炼的Integer to Roman的解法了如何判断string是valid roman数字
这种题简直太恶心了!盒子面经
进入JobHunting版参与讨论
g****e
发帖数: 172
11
好多计算机书上的例子就是。。

【在 i***d 的大作中提到】
: 大牛们有谁写过罗马数字转换成十进制和十进制转换成罗马数字的啊?
: 能不能帮忙贴一下,写了一个下午,还是没有思路。先谢谢了!

i***d
发帖数: 28
12
谢谢,大牛们的帮助!
c*****e
发帖数: 3226
13
理解原理就简单了。
http://rosettacode.org/wiki/Roman_numerals#C

【在 i***d 的大作中提到】
: 谢谢,大牛们的帮助!
H****r
发帖数: 2801
14
兔爷开搞java啦?难道从了facebook?

【在 p*****2 的大作中提到】
: import java.io.*;
: import java.util.*;
: public class Roman
: {
: public static void main(String[] args)
: {
: new Roman().run();
: }
: PrintWriter out = null;
: void run()

p*****2
发帖数: 21240
15

看了一下这帖子是F锯了我没多久写的吧? 当时还没做leetcode呢。

【在 H****r 的大作中提到】
: 兔爷开搞java啦?难道从了facebook?
H****r
发帖数: 2801
16
唉,的确没看时间

【在 p*****2 的大作中提到】
:
: 看了一下这帖子是F锯了我没多久写的吧? 当时还没做leetcode呢。

x*****p
发帖数: 1707
17
See the code in Java.

【在 i***d 的大作中提到】
: 谢谢,大牛们的帮助!
e***s
发帖数: 799
18
我贴个C#的吧,不过前面要自己顶一个一个lookup table
public static int RomantoInteger(string s)
{
int ret = 0;
if (s.Length == 0)
return ret;
string num1 = "";
string num10 = "";
string num100 = "";
string num1000 = "";
for (int i = 0; i < s.Length; i++)
{
if (s[i] == 'I' || s[i] == 'V')
{
num1 = s.Substring(i);
break;
}
if (s[i] == 'X' || s[i] == 'L' || (num10 != "" && s[i] == 'C
'))
{
num10 += s[i];
continue;
}
if (s[i] == 'C' || s[i] == 'D' || (num100 != "" && s[i] == '
M'))
{
num100 += s[i];
continue;
}
if (s[i] == 'M')
num1000 += s[i];
}
ret += num1000.Length * 1000;
for (int i = 0; i < D100.Length; i++)
{
if (num100 == D100[i])
{
ret += (i + 1) * 100;
break;
}
}
for (int i = 0; i < D10.Length; i++)
{
if (num10 == D10[i])
{
ret += (i + 1) * 10;
break;
}
}
for (int i = 0; i < D1.Length; i++)
{
if (num1 == D1[i])
{
ret += (i + 1);
break;
}
}
return ret;
}
1 (共1页)
进入JobHunting版参与讨论
相关主题
说个epic的机考题目leetcode: integer to roman 结果不同
贡献一道面试题目:找出在一个数组里面只出现1次的两个数字integer to roman的考点在哪里呢?
一道要求常数空间和O(n)时间的排序题今天算是见到最精炼的Integer to Roman的解法了
L家phone面,悲剧这种题简直太恶心了!
跪求roman number to integer 和 integer to roman number的程序LeetCode上的Integer to Roman和 Roman to Integer
amazon罗马数字变化的题是啥?如何判断string是valid roman数字
贡献个题盒子面经
问了3个设计题,2个coding题@L问一道前几天在版上看见的题
相关话题的讨论汇总
话题: int话题: return话题: num话题: string话题: ret