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