LeetCode Contest 246
写代码速度有点慢,没想到最后一题还是偏简单,第二题和第三题浪费太多时间了
T1: Largest Odd Number in String
找出最长的奇数大整数:找到最后一个奇数,前面的子串就是答案
T2: The Number of Full Rounds You Have Played
给定两个时间:startTime和finishTime,计算中间隔了多少个Quarter-Hour。分别计算两者距离00:00有多少个Quarter-Hour,然后两者相减即可
private int check(String time) {
String[] ti = time.split(":");
int hh = Integer.valueOf(ti[0]);
int mm = Integer.valueOf(ti[1]);
return 60 * hh +mm;
}
public int numberOfRounds(String startTime, String finishTime) {
int sTime = check(startTime);
int fTime = check(finishTime);
if (sTime > fTime) {
fTime += 24 * 60;
}
sTime = (sTime / 15) + ((sTime % 15 == 0) ? 0 : 1);
fTime = fTime / 15;
int ans = fTime - sTime;
return ans < 0 ? 0 : ans;
}
T3: Count Sub Islands
统计grid2中有多少个Islands是grid1的子集,暴力即可,先统计grid2中的Island,然后判断是不是grid1的子集
T4: Minimum Absolute Difference Queries
给定序列A, 询问a[i]到a[j]中,最小的绝对值之差,A的值在[1, 100]。
没想到这题这么弱智。由于A的值很小,所以维护一个100*nums.length的数组,然后每次询问,先确定这个询问范围内的值,然后计算最小绝对值即可。
private int maxn = 100;
public int[] minDifference(int[] nums, int[][] queries) {
int n = nums.length;
int[] ans = new int[queries.length];
int[][] fn = new int[maxn][n+1];
for(int i=0;i<n;i++) {
fn[nums[i]-1][i+1] += 1;
}
for(int k=0;k<maxn;k++) {
for(int i=1;i<=n;i++) {
fn[k][i] += fn[k][i-1];
}
}
for(int i=0;i<queries.length;i++) {
int old = -1;
ans[i] = -1;
for(int k=0;k<maxn;k++) {
if (fn[k][queries[i][1]+1] - fn[k][queries[i][0]] == 0) {
continue;
}
if (old != -1) {
if (ans[i] == -1) {
ans[i] = k - old;
} else {
ans[i] = Math.min(ans[i], k - old);
}
}
old = k;
}
}
return ans;
}