Leetcode - "Roman to Integer" & "Integer to Roman"

来源:互联网 发布:黄岩司法淘宝拍卖网 编辑:程序博客网 时间:2024/04/29 12:21

话说周日去了一趟De Young,发现图片超过2M限制,懒得处理了,也就不PO图了。那时候在三藩市和UPENN的室友时候聚会,给他送了个Beats的红色骚耳机,希望他回国之后一切都顺利吧。今天早上看了Princeton的algorithm 2,这门coursera课真的超喜欢,甚至远超过machine learning那门课。

博主最近没有精神,估计是偶尔为工作发愁。


====================================================================

下午看了宇妹昨晚刷的两道题目,因为印象很深,而且题目不难,所以答案一下子就有:

#1:set matrix zero: 使用第一行和第一列来标记改行或者该列是不是该设置为0;[0][0]位置用来记录第一行或者第一列是否包含0元素。
#2:linkedlist cycle 2: fast runner & slow runner相遇,然后另外一个slow runner从开始点出发,slow runner从相遇点出发,两个相遇的地方就是重复点。
数学证明:假设直线段长度为M,环的长度为N,第一次相遇的地方在离环形接口x处,满足:M + K*N + x = 2*(M+x)。得到:M + x = K*N。所以另外一个slow runner走M的时候,前一个slow runner离交点(M + x)也就是K*N,因此刚好是回到交点。

算是“刷完”两题,然后去了一下健身房踩自行车,顺便学了一个小时的日语。


====================================================================

晚上做了一下roman to integer和integer to roman两道题目。

#1 roman to integer

罗马数字转换有三个准则:
#1:小数字在前是减法
#2:大数字在前是加法
#3:同一个数字不能出现超过三次

算法其实就按照前两个准则进行就可以了,记得把最后一个数字也加进来就好:

public class Solution {    public int romanToInt(String s) {        HashMap<Character, Integer> map = new HashMap<Character, Integer>();        map.put('M', 1000);        map.put('D', 500);        map.put('C', 100);        map.put('L', 50);        map.put('X', 10);        map.put('V', 5);        map.put('I', 1);                int num = 0;        char[] c = s.toCharArray();        for (int i = 0; i < s.length() - 1; i++) {            if (map.get(c[i]) >= map.get(c[i+1])) num += map.get(c[i]);            else num -= map.get(c[i]);        }        num += map.get(c[s.length()-1]);        return num;    }}


====================================================================

#2 Integer to Roman

数学上的是按照radix的方式去处理这种题目的,radix的定义是:一个进制里面的不同的digit。
比如十进制不同的数字有0,1,2,3,4,5,6,7,8,9
而二进制的不同数字有0,1
把一个数按照该进制表示就是先求商,再求余。

在int to roman这道题目中,认为radix有以下:
{1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1}
对应的字符是:
{"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};

这样认为是为了处理方便。

public class Solution {    public String intToRoman(int num) {        // two arrays        int[] radix = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};        String[] symbol = {"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};        String s = "";        for (int i = 0; i < radix.length; i++) {            int count = num / radix[i];            num %= radix[i];            for (int j = 0; j < count; j++) {                s += symbol[i];            }        }        return s;    }}



0 0
原创粉丝点击