c********t 发帖数: 5706 | 1 Leetcode Integer to Roma
看完题,读了一下wiki,好像不那么复杂,行云流水写下如下code,竟然很少有的bug
free,沾沾自喜。查查别人的解法,有人说写成我这样会被面试官直接送回家。
帮我看看,至于吗?有啥问题?
public String intToRoman(int num) {
// Start typing your Java solution below
// DO NOT write main() function
StringBuilder sb = new StringBuilder();
while (num > 0) {
if (num >= 1000) {
sb.append('M');
num -= 1000;
} else if (num >= 900) {
sb.append("CM");
num -= 900;
} else if (num >= 500) {
sb.append('D');
num -= 500;
} else if (num >= 400) {
sb.append("CD");
num -= 400;
} else if (num >= 100) {
sb.append('C');
num -= 100;
} else if (num >= 90) {
sb.append("XC");
num -= 90;
} else if (num >= 50) {
sb.append('L');
num -= 50;
} else if (num >= 40) {
sb.append("XL");
num -= 40;
} else if (num >= 10) {
sb.append('X');
num -= 10;
} else if (num >= 9) {
sb.append("IX");
num -= 9;
} else if (num >= 5) {
sb.append('V');
num -= 5;
} else if (num >= 4) {
sb.append("IV");
num -= 4;
} else {
sb.append('I');
num--;
}
}
return sb.toString();
} | C***U 发帖数: 2406 | 2 用table 会好看很多
我开始也是这样写的
但是看过table写法 都不好意思看自己写的了
【在 c********t 的大作中提到】 : Leetcode Integer to Roma : 看完题,读了一下wiki,好像不那么复杂,行云流水写下如下code,竟然很少有的bug : free,沾沾自喜。查查别人的解法,有人说写成我这样会被面试官直接送回家。 : 帮我看看,至于吗?有啥问题? : public String intToRoman(int num) { : // Start typing your Java solution below : // DO NOT write main() function : StringBuilder sb = new StringBuilder(); : while (num > 0) { : if (num >= 1000) {
| l*******b 发帖数: 2586 | 3 string intToRoman (int num) {
map t;
t[1000] = 'M';
t[500] = 'D';
t[100] = 'C';
t[50] = 'L';
t[10] = 'X';
t[5] = 'V';
t[1] = 'I';
string rom = "";
int k = 1000;
while (k > 0) {
int q = num / k;
if(q < 4)
for(; q > 0; q--)
rom += t[k];
else if (q == 4) {
rom += t[k];
rom += t[k*5];
}
else if (q == 5)
rom += t[k*5];
else if (q < 9) {
rom += t[k*5];
for(; q > 5; q--)
rom += t[k];
}
else {
rom += t[k];
rom += t[k*10];
}
num %= k;
k /= 10;
}
return rom;
}
应该也不是table的写法。。。不知道怎样 | x*********s 发帖数: 2604 | | Q*******e 发帖数: 939 | 5 没哈, 先Native, 然后优化
回字的写法不同而已 | k****r 发帖数: 807 | 6 我看到的解法中也是二维array的方法最好看了,
把 1 2 3 4 5 6 7 8 9啥的都存成 I II III, 。。。
然后判断,看的清楚,写的也方便 | j*****s 发帖数: 189 | 7 class Solution {
public:
string intToRoman(int num) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
string s;
s += toRoman(num / 1000, "", "", "M");
s += toRoman(num / 100 % 10, "M", "D", "C");
s += toRoman(num / 10 % 10, "C", "L", "X");
s += toRoman(num % 10, "X", "V", "I");
return s;
}
string toRoman(int val, string ten, string half, string one){
string res;
if(val == 0){
return res;
}
if(val > 0 && val <= 3){
for(int i = 0; i< val; ++i){
res += one;
}
}
else if(val == 4){
res = one + half;
}
else if(val == 5){
res = half;
}
else if(val > 5 && val < 9){
res = half;
for(int i = 0; i< val - 5; ++i){
res += one;
}
}
else{
res = one + ten;
}
return res;
}
};
这样有没有简洁一些。 | c*****a 发帖数: 808 | 8 忘了哪里看的。。。我保存着
public String intToRoman(int num) {
String digit[] = new String[]{"", "I","II","III","IV", "V","VI","VII
","VIII","IX"};
String ten[] = new String[]{"", "X","XX","XXX","XL","L","LX","LXX",
"LXXX","XC"};
String hundred[] = new String[]{"", "C", "CC", "CCC", "CD", "D", "DC
", "DCC", "DCCC", "CM"};
String thousand []= new String[] {"", "M", "MM", "MMM"};
StringBuffer result = new StringBuffer();
if(num >3999)
num = 3999;
if(num<0)
num = 0;
result.append(thousand[num/1000]);
result.append(hundred[num/100 %10]);
result.append(ten[num/10 %10]);
result.append(digit[num%10]);
return result.toString();
} | c********t 发帖数: 5706 | 9 恩,确实简洁!
多谢!
★ 发自iPhone App: ChineseWeb 7.7
【在 c*****a 的大作中提到】 : 忘了哪里看的。。。我保存着 : public String intToRoman(int num) { : String digit[] = new String[]{"", "I","II","III","IV", "V","VI","VII : ","VIII","IX"}; : String ten[] = new String[]{"", "X","XX","XXX","XL","L","LX","LXX", : "LXXX","XC"}; : String hundred[] = new String[]{"", "C", "CC", "CCC", "CD", "D", "DC : ", "DCC", "DCCC", "CM"}; : String thousand []= new String[] {"", "M", "MM", "MMM"}; : StringBuffer result = new StringBuffer();
| c********t 发帖数: 5706 | 10 Backtracking怎么解?
★ 发自iPhone App: ChineseWeb 7.7
【在 x*********s 的大作中提到】 : 用backtracking会更简洁些
| | | b***m 发帖数: 5987 | | f******t 发帖数: 32 | 12 程序的readability很重要。写出bug free是第一步。如果我是面试官,在你写完这个
程序后,我会问你怎么样能够改写code来增加程序的readability。
【在 c********t 的大作中提到】 : Leetcode Integer to Roma : 看完题,读了一下wiki,好像不那么复杂,行云流水写下如下code,竟然很少有的bug : free,沾沾自喜。查查别人的解法,有人说写成我这样会被面试官直接送回家。 : 帮我看看,至于吗?有啥问题? : public String intToRoman(int num) { : // Start typing your Java solution below : // DO NOT write main() function : StringBuilder sb = new StringBuilder(); : while (num > 0) { : if (num >= 1000) {
| p*****2 发帖数: 21240 | 13
这个跟我得解法差不多。
【在 j*****s 的大作中提到】 : class Solution { : public: : string intToRoman(int num) { : // Start typing your C/C++ solution below : // DO NOT write int main() function : string s; : s += toRoman(num / 1000, "", "", "M"); : s += toRoman(num / 100 % 10, "M", "D", "C"); : s += toRoman(num / 10 % 10, "C", "L", "X"); : s += toRoman(num % 10, "X", "V", "I");
| m**********0 发帖数: 356 | 14 这个。。。你平时这么写code的?peer review没人提意见么?
【在 c********t 的大作中提到】 : Leetcode Integer to Roma : 看完题,读了一下wiki,好像不那么复杂,行云流水写下如下code,竟然很少有的bug : free,沾沾自喜。查查别人的解法,有人说写成我这样会被面试官直接送回家。 : 帮我看看,至于吗?有啥问题? : public String intToRoman(int num) { : // Start typing your Java solution below : // DO NOT write main() function : StringBuilder sb = new StringBuilder(); : while (num > 0) { : if (num >= 1000) {
| s**x 发帖数: 7506 | 15 这种写法应该被 microsecond 据。
重复的代码, 重复的逻辑. | O******i 发帖数: 269 | 16 太多并列的if else语句应该是大忌吧,再不济也应该用switch case
【在 c********t 的大作中提到】 : Leetcode Integer to Roma : 看完题,读了一下wiki,好像不那么复杂,行云流水写下如下code,竟然很少有的bug : free,沾沾自喜。查查别人的解法,有人说写成我这样会被面试官直接送回家。 : 帮我看看,至于吗?有啥问题? : public String intToRoman(int num) { : // Start typing your Java solution below : // DO NOT write main() function : StringBuilder sb = new StringBuilder(); : while (num > 0) { : if (num >= 1000) {
| c********t 发帖数: 5706 | 17 thx!
【在 b***m 的大作中提到】 : 呵呵,给楼主一个窍门:空间换时间。
| d*********g 发帖数: 154 | 18 贴个我写的:
private static final char[] romanLetters = {'I', 'V', 'X', 'L', 'C', 'D', 'M
'};
public String intToRoman(int num)
{
String result = "";
int index = -1;
while(num > 0)
{
int digit = num % 10;
num /= 10;
++index;
if(digit == 0) continue;
result = processDigit(digit, index) + result;
}
return result;
}
private String processDigit(int digit, int index)
{
String digitResult = "";
if(digit == 4 || digit == 9)
{
digitResult += romanLetters[index*2];
digitResult += (digit == 4 ? romanLetters[index*2+1] : romanLetters[
index*2+2]);
}
else
{
int minusFiveOrNot = digit <= 3 ? 0 : 5;
digitResult += (digit <= 3 ? "" : romanLetters[index*2+1]);
for(int i = 1; i <= digit-minusFiveOrNot; ++i)
digitResult += romanLetters[index*2];
}
return digitResult;
} | m****t 发帖数: 2329 | |
|