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

话说周日去了一趟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 integerinteger 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;
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值