哎,今天参加了次leetcode的周赛。。感觉自己太年轻,一共四道题只做出了两道,有点丧。。。不过还是要安慰安慰自己,非科班而且只刷算法两个月,做出两道不错了~~~但是讲真的,还是丧啊,看完第四题感觉再学两个月也不一定能会,烦死了都。。。算了,换个心情,继续刷简单的题目来找找信心!
比较字符串最小字母出现频次
题目:我们来定义一个函数 f(s),其中传入参数 s 是一个非空字符串;该函数的功能是统计 s 中(按字典序比较)最小字母的出现频次。例如,若 s = "dcce",那么 f(s) = 2,因为最小的字母是 "c",它出现了 2 次。现在,给你两个字符串数组待查表 queries 和词汇表 words,请你返回一个整数数组 answer 作为答案,其中每个 answer[i] 是满足 f(queries[i]) < f(W) 的词的数目,W 是词汇表 words 中的词。
思路:审了好几遍题总算是看明白了。感觉应该不难,首先最小字母出现次数应该是依次遍历数组代替下表就可以做到。其次就暴力的解法就是双循环暴力解。但是具体怎么做能不能优化我再看看吧,先去写代码了。
改了两遍性能也才超过百分之八十五的人,先贴上代码吧:
class Solution {
public int[] numSmallerByFrequency(String[] queries, String[] words) {
int max = 0;
int[] d = new int[11];
for(String s : words){
d[getN(s)]++;
}
int[] res = new int[queries.length];
int idx = 0;
for(int i = 0;i<queries.length;i++){
int sum = 0;
for(int j = 1;j<11;j++ ){
if(d[j]>0 && getN(queries[i])<j){
sum += d[j];
}
}
res[idx] = sum;
idx++;
}
return res;
}
public int getN(String s){
int[] d = new int[26];
for(char i : s.toCharArray()){
d[i-'a']++;
}
for(int i : d){
if(i>0) return i;
}
return -1;
}
}
其实还有一个直接存储结果的想法,就是下标0存的是大于1的所有数,下标1 存的是大于2的所有数。。依次类推。但是我是真的懒得写了,心烦意乱的。直接看性能排行第一的代码吧。
没啥说的,思路是对的,直接贴代码:
class Solution {
public int[] numSmallerByFrequency(String[] queries, String[] words) {
// 统计
int [] counter = new int[12];
for (int i = 0; i < words.length; i++)
counter[getN(words[i])]++;
// 累和
for (int i = 9; i >= 0; i--)
counter[i] += counter[i + 1];
// 拿值
int[] ret = new int[queries.length];
for (int i = 0; i < queries.length; i++)
ret[i] = counter[getN(queries[i]) + 1];
return ret;
}
public int getN(String s){
int[] d = new int[26];
for(char i : s.toCharArray()){
d[i-'a']++;
}
for(int i : d){
if(i>0) return i;
}
return -1;
}
}
公交站间的距离
题目:环形公交路线上有 n 个站,按次序从 0 到 n - 1 进行编号。我们已知每一对相邻公交站之间的距离,distance[i] 表示编号为 i 的车站和编号为 (i + 1) % n 的车站之间的距离。环线上的公交车都可以按顺时针和逆时针的方向行驶。返回乘客从出发点 start 到目的地 destination 之间的最短距离。
思路:这个题反正乍一看是送分题,具体怎么样我先去做了,指不定是又审题不清呢。
class Solution {
public int distanceBetweenBusStops(int[] distance, int start, int destination) {
int s = 0;
int n = 0;
for(int i = 0; i<distance.length;i++){
s += distance[i];
if((start<=i && destination>i) || (start>i && destination<=i)){
n += distance[i];
}
}
return s-n>n?n:s-n;
}
}
百分百性能,这个题简直简单的无脑了,直接下一题吧。
一周中的第几天
题目:给你一个日期,请你设计一个算法来判断它是对应一周中的哪一天。输入为三个整数:day、month 和 year,分别表示日、月、年。您返回的结果必须是这几个值中的一个 {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}。
思路:这个题怎么说呢,昨天还是前天做过一个类似的,判断年中某天,这道题可以借用一下。直接判断除1971年1月1日是哪天就行了。因为1月1日是周五,所以从周五开始算就行了,另外判断当前日期到1971.1.1除7余了几天就行,反正自己看代码吧
class Solution {
public String dayOfTheWeek(int day, int month, int year) {
int y=1971,d=0,m=0,res=0;
int[] monday ={31,28,31,30,31,30,31,31,30,31,30,31};
for(;y<year;y++){
if((y%4==0&&y%100!=0)||y%400==0) res +=366;
else res +=365;
}
if((y%4==0&&y%100!=0)||y%400==0) monday[1] =29;
for(;d<month-1;d++){
res += monday[d];
}
res +=day;
res = (res-1)%7;
switch(res){
case 0:
return "Friday";
case 1:
return "Saturday";
case 2:
return "Sunday";
case 3:
return "Monday";
case 4:
return "Tuesday";
case 5:
return "Wednesday";
case 6:
return "Thursday";
default: break;
}
return "";
}
}
这道题其实我觉得是麻烦有余技巧不足,反正我不是很喜欢这种。完全不知道考点是什么。
今天的笔记就到这里了,三道题拿低保~~然后今天比较丧,希望明天能调整好。也祝大家工作顺顺利利!