emm,上个周日参加的LeetCode周赛,发生了一些神奇的事情。
首先,这场比赛是我在LeetCode参加的第一场,确切的说,这是我第一次在LeetCode上刷题(雾)。我也不知道我哪里来的兴致,在看到比赛时上头的直接报名。。。。。。
当然这样的第一次确实在比赛中造成了困扰。。
题目中相应代码会贴出来,只能过,不保证高名次
T1:有多少小于当前数字的数字
打开题目一看,哇塞,眼前一亮,这难道就是传说中的防爆零题目吗?操起键盘就要开写。我兴奋又熟练的打开我的DEV C++,心想着竞赛要用最快的语言来写代码,java它是真的慢,C语言数据大的时候能快出一个数量级呢/doge。
当我开开心心敲出一个带有头文件和主函数以及自己定义的函数的代码准备上交时,我打开提交窗口。。。
woc?什么鬼,为什么这个东西疯狂报错。。。。
冷静分析发现,事情好像并不是我想象的那样。。emm,好滴吧,看来我并不知道这个网站的代码提交规则,我只是,按着别的网站规则相当然的敲了二十多行代码。
接着,我打开了网站内的说明,这才搞懂原来它的编程目的是实现相关功能的函数或是类方法,并不需要提供主函数和头文件。emm。。。。看来是时候做出进步了。
在拷贝了它提供给我的函数框架后,我望着代码,陷入了沉思。。。我发现好像在学校学了个假的C语言,由于并没有对于内存管理的相关知识,我尝试着用malloc乱搞了几下过后,便放弃了。看了一眼时间,天!快半个小时过去了。。。。
“那好吧”,我默默关掉了Dev编译器,打开了eclipse,将提交语言切换成了java。啊~nice,java的画风果然清晰了好多。数组直接当做对象传来传去,不用像C语言那样同内存和指针斗智斗勇了,可以将注意力放到程序实现上,只需要在类中实现特定方法即可,爽的一匹。
然后,顺着之前的思路,三下五除二,重写了便代码,把这个送分题水掉。难忘的第一题结束了,来不及庆祝,因为比赛还在如火如荼进行着。
T1代码
class Solution {
public int[] smallerNumbersThanCurrent(int[] nums) {
int[] ans = new int[nums.length];
for(int i = 0;i < nums.length;i++)
{
for(int j = 0;j < nums.length;j++)
{
ans[i] += nums[j] < nums[i] ? 1 : 0;
}
}
return ans;
}
}
T2:通过投票对团队排名
确定语言以后,我很快进入到了比赛的状态。因为一直在其他的oj上用java刷题,所以用java实现算法的熟练度其实并不亚于C语言,反而由于java提供了很多封装好的类,让很多算法的实现难度大大减小。比如这一道题。
其实这一道题难点就在于多关键字排序和名称映射。能把出现的名称映射成唯一确定的id,投票后根据票号进行多关键字排序,这个题目也就解决了
幸而,java的面向对象特性能让我很方便的建立“团队”这个类并实现Comparable接口重写compareTo方法实现多关键字排序。(其实题目中对于优先级的描述补充了全相等比较名称的规则,在实现程序的时候才发现)在类中,定义这个团队的名称(char类型),获得票数的统计数组及其对应的id。
另外,java的map也相当的给力,处理这种名称到id非常得心应手。另外由题知,所有名称一定会在第一次的投票中出现,所以,就先来造一波映射,后面慢慢用。
最后,java对字符串的处理也很方便。最终结果,直接用加号就可以实现字符串和单个字符的拼接,可谓是么得感情的答案产生机器。、
手起码落,第一次提交死在了空字符串和空指针的错误上。忘记了空答案应该是空字符串而非空指针,于是改了发答案的初值,提交,完事。 罚了五分钟,还可以接受。
T2代码:
class Solution {
class Team implements Comparable<Team>
{
int[] p = new int[30];
char ch;
Team(char ch)
{
this.ch = ch;
}
@Override
public int compareTo(Team o) {
// TODO Auto-generated method stub
for(int i = 0;i < tot;i++)
{
if(p[i] != o.p[i])
{
return o.p[i] - p[i];
}
}
return ch -