13. Roman to Integer
[抄题]:
[暴力解法]:
时间分析:
空间分析:
[思维问题]:
- 没有想到罗马字是逆序的情况
- 没有想到要先用toCharArray()方法把字符串拆成一个字符串数组
[一句话思路]:
[输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):
[画图]:
[一刷]:
- toInt函数要用。否则不能直接给字母比大小
- 不是void类型的函数就要返回默认值,return 0
[二刷]:
[三刷]:
[四刷]:
[五刷]:
[五分钟肉眼debug的结果]:
[总结]:
toInt函数要用。否则不能直接给字母比大小
[复杂度]:Time complexity: O(n) Space complexity: O(n)
[英文数据结构或算法,为什么不用别的数据结构或算法]:
直接背英文对应的数字就行了
[其他解法]:
[Follow Up]:
[LC给出的题目变变变]:
[代码风格] :
public class Solution { /* * @param s: Roman representation * @return: an integer */ public int romanToInt(String s) { char[] sc = new char[s.length()]; sc = s.toCharArray(); int ans = toInt(sc[0]); for (int i = 1; i < s.length(); i++) { ans += toInt(sc[i]); if (toInt(sc[i - 1]) < toInt(sc[i])) { ans -= 2 * toInt(sc[i - 1]); } } return ans; } //toInt private int toInt (char s) { switch(s) { 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; } }
整数转罗马字
[抄题]:
[暴力解法]:
时间分析:
空间分析:
[思维问题]:
觉得可能有很多种分解方法:应该数位分离,把千百十位分别挑出来,就只有一种了
[一句话思路]:
[输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):
[画图]:
[一刷]:
- 把不同的罗马字拼起来也是写+号
[二刷]:
[三刷]:
[四刷]:
[五刷]:
[五分钟肉眼debug的结果]:
[总结]:
- 记住罗马字符数组的顺序是M C X I即可
- String M[] = {"", "M", "MM", "MMM"};写法不同 String C[] = {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"};
[复杂度]:Time complexity: O() Space complexity: O()
[英文数据结构或算法,为什么不用别的数据结构或算法]:
无
[其他解法]:
[Follow Up]:
[LC给出的题目变变变]:
273. Integer to English Words 差不多,小于20的数单独列出来即可
[代码风格] :
public class Solution { /** * @param n: The integer * @return: Roman representation */ public String intToRoman(int n) { String M[] = {"", "M", "MM", "MMM"}; String C[] = {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"}; String X[] = {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"};//XL String I[] = {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"}; return M[(n / 1000) % 10] + C[(n / 100) % 10] + X[(n / 10) % 10] + I[n % 10]; } }