-
海量积分排序的二分实现
简单描述下问题:有一个网站,现在有很多用户,每个用户有一个积分,要求在用户登录时显示用户的积分排名,用户的积分会有变动。注意考虑数据量比较大的场景。 原理是以树的方式来分解排名的计算。参考在这里。 实际代码分为三部分: 查询某个积分的排名 更新积分 构造积分树 查询积分排名 原理是计算所有右子树或者同级节点的和,再加1。每个节点包含当前积分或者积分段内的用户总数。右子树或者同级节点代表大于指定积分的积分节点。排名的实际含义就是计算所有大于自己积分的人的总数。最后加1是因为大于最大积分的人的总数为0,但是排名不能为0,所以实际显示是必须加1的。 这块实际依赖树的结构,可能是数组或者是链表,但通用逻辑如下(递归): in: current node, score if current node is score node if current node is left leaf return count of right sibling else # current node is right node, no right sibling return 0 else # current node is score range node if score in left subtree…
-
zero sum subsequence problem solution 1
题目是这样的,给定一个整数序列,比如[1, 2, -1, 8, -9],要求找出一个子序列,其所有数字的和为0,比如子序列[2, -1, 8, -9],并输出子序列在主序列中的位置,比如[2, -1, 8, 9]在主序列[1, 2, -1, 8, -9]中的位置为[1, 4]。 以下是我想到的一个方法,暂时不清楚怎么计算这个的时间复杂度。原理是这样的,对于序列[1, 2, -1, 8, -9],设置一个和序列。初始为[0, 0, 0, 0, 0],长度和输入序列一致。 顺序读取输入序列,第一次遇到1,尝试在和序列的[0, 0]区别内增加1,结果为[1, 0, 0, 0, 0]。为什么这么做呢,这样,输入序列区间[0, 0]的和就计算出来了。 第二次遇到2, 尝试在和序列[0, 1]区间内增加2,结果为[3, 2, 0, 0, 0],这样,输入序列区间[0, 1], [1, 1]的和就计算出来了。没有发现0和序列。 接下来依此类推,发现[1, 4]区间的和为0,输出为(1, 4)。代码如下(python): #!/usr/bin/env python import sys def find_zero_sum_seq(seq): sums = [0] *…
-
MH4的配装和配装器使用小记
最近由于996,没怎么玩,但是配装之前就想要写写了。 作为一个MH4新手,一开始不知道怎么弄防具,甚至防具有剑士和ガンナー用的都不知道。好在玩了一段时间自己也领会了,而且找到了个不错的推荐防具的页面。村5和集会所3之前,我就参照上面推荐的前三套剑士服做了一下。之后又去打黑蚀龙,大大改变了自己的战术——防具一定要选好技能,陷阱之类的不是仅仅在捕获时用的。 于是乎按照集英社的攻略书上的推荐技能,想要配一套体力+50和纳刀术的防具。不过自己配感觉不放心,装饰品,防具技能点要一个个算过来,何况还有胴系统倍化。后来在TGBUS的MH4论坛上看到配装器,就尝试着用了一下,感觉还不错。个人的使用方法如下: 选择你要的技能,比如体力+50和纳刀术,设置你的武器槽数,比如我的是1个,游戏进度是村5集3,按下检索就会出现筛选出来的结果。但这还不能直接用,需要排除一些你现在不能做的防具,或者你不太想做的防具(因为素材难打),还有去另外一个tab中去除你不能造或不想造的装饰品,按照某个值排序,比如防御,不断重复这样的操作,最终得到的才可能是你想要的。最终配好之后,建议加入我的集合,免得下次再重复这样的操作。 老实说,配装器用的是穷举的方法,因此出来的数量可能超过9999(配装器左下角数量限制是9999),而且貌似每次排除的装备都要重新设置一遍。用的次数多了,感觉按照技能选择装备是个不错的方法,但是还是需要一些通用的装配。换句话说,推荐的防具和自己配还是需要的,配装器只是作为参考,特别是你觉得配出来能力可以,但是样子奇丑的时候……
-
git svn使用小记2 非标准的分支流
假如你遇到一条非标准的分支流,即不是/branches/xxx这种形式的,该怎么让git识别?以下是我从stackoverflow上学到的一个简单方法,如有更好的方法,欢迎指出。 git config –add svn-remote.newbranch.url https://svn/path_to_newbranch/ git config –add svn-remote.newbranch.fetch :refs/remotes/newbranch git svn fetch newbranch [-r<rev>] git checkout -b local-newbranch -t newbranch git svn rebase newbranch 执行了上述命令后,.git/config中其实会增加如下内容 [svn-remote “newbranch”] url = http://path/to/your/repository fetch = :refs/remotes/newbranch [branch “local/newbranch”] remote = . merge = refs/remotes/newbranch 然后你就可以使用非标准的branch了。
-
MH4 チャージアックス 使用小心得
作为玩MH4的新手,在村一星所有武器训练中,一开始看中了轻弩和重弩。但是在对战速度很快的怪时有点力不从心,而且在花了30+分钟打一只甲虫之后决定换一个近战武器。在所有近战武器中,我最终选择了チャージアックス。 チャージアックス是MH4新增的武器,当然,对新手来说,哪个武器都是新武器。从一开始随便乱砍,到学习武器训练里面的模式,再研究连招,查询使用资料包括GP(攻击防御判定),到最后得到了自己的使用方式:炮术,也算是有一点心得,下面就详细讲解下。 首先是炮术。炮术对チャージアックス的好处在于增加伤害。一开始看到炮术,认为和チャージアックス没关系,因为是炮嘛,和轻弩、重弩关系大一些。后来看了别人博客之后,发现炮术也可以提高チャージアックス的伤害。实际中,如果有炮术王(技能点15)的话,实际体验下来部位破坏的subtarget相对容易达成。不过炮术好像只对榴弹瓶而且是最后的属性解放斩有效。为了达到这个要求,使用チャージアックス必须掌握如何快速放出最后的属性解放斩。 武器训练中推荐的斧模式操作是:变成斧头,不断按A,最后会出来属性解决斩。实战中,除了怪非常大的DOWN之外,以及周围没人的情况下,可以放放。否则不是被怪PIA飞,就是把同伴PIA飞。跳过中间的大回旋斩的方式主要是按X+A放最后的属性解决斩。具体来说,有如下几种方式:
-
代码吐槽1
我发现离厕所远一点有一点好:在去厕所的路上经常会有idea出来,这篇文章就是其中之一。 言归正传,我对看到的别人的代码吐槽的想法由来已久。大部分时候,碍于情面不能直说。有时候委婉地说了,愿意听的当场改,大部分时候都我行我素。以至于我觉得写这些代码的时候是不是都是从北大青鸟出来的? 第一个:尤达表达式,null = someVariable(Java代码中) 我很敬佩从C/C++转到Java的人,但是我很看不起转过来了不学习相应语法的人。 第二个:collection.size() == 0 估计老师没教过collection.isEmpty() 第三个:StringUtils.equals(“foo”, someVariable) 公司规范的受害者,而且顽固不化。什么时候需要用工具类来比较,什么时候不需要分不清。 第四个:someMap.get(SomeConstains.ABC)出现多处 只有一处问题不大,多处不知道static import。
-
カララアジャラ(蛇竜種)狩猎小记
作为在村五星任务黑龙之前的四星关键任务的怪物,个人感觉因为它和之前的怪物战斗方式的不同,导致我一开始打它时只能用いらいら,拼血来形容。具体来说,个人以前对付怪物的方式是远距离绕怪物跑,大部分怪物都会冲过来,等他放完招之后上去砍。但是カララアジャラ不行,他会用尾巴扇你,甚至会把你卷过来,而且一卷就是半血(以我カブラーシリーズ120左右防御150血计算75+)。中等距离貌似也不行,カララアジャラ会甩鳞片然后咆哮爆破。对付鳞片我一开始不了解怎么破,最近一次大致明白了了两种办法:第一种是带上防咆哮的オトモ(就是猫猫),猫猫特工队任务(即有化け鮫的任务)之后有一只会在暖暖岛上(就是那三只任务中逃跑的其中一只……),貌似可以降低咆哮率;第二种是自己去砍鳞片,如果实在来不及逃跑的话。距离方面个人从攻略(集英社的那本)上了解到还是近程好一些。攻略也提到了大致的狩猎要点,就是砍他露在外面的脚,一定次数之后怪物会down,这是你就可以去砍怪物的头了。还有另外一种方法是在他咆哮的时候跑到侧面砍。跑的方向最好是左边,这个与一开始的狗龙是一样的。(狗龙是因为他顺时针甩尾,但是カララアジャラ个人没看清他的方向)。另外カララアジャラ的尾巴一直都是硬的,除了累的时候。因为罠肉之类的我不会用,所以没考虑砍尾巴。实际战斗中攻略没提到近程的时候カララアジャラ会绕你一圈想卷你。个人体验下来,这个圈有出口,在他的头下面。你大概有两次逃跑机会,滚出圈或者走去好像都行。个人感觉操虫棍的话很容易跳出去的吧。如果你胆大,冒险狂打头估计也行————个人没试过。以上就是大致战术上的方法。 武器上我用的是シールドスクアーロ(チャージアックス),有冰属性。这把武器是用化け鮫强化的,事实上我是先打雌火龙造出火属性的ディア=ルテミス,再用ディア=ルテミス打化け鮫,再用化け鮫造出来的武器去打カララアジャラ。从实际任务出的顺序来说,应该是先造冰属性的シールドスクアーロ。不过不管了。为了材料多一些,打雌火龙和化け鮫的时候都用得捕获,并且尽量达成副任务。冰属性的这把武器会心率为-20%,其实影响不大,正常情况下只会降低5%的攻击力。如果怪物怕冰的话,这部分损失的攻击力立马被冰属性额外的加成弥补了。如果你用チャージアックス打カララアジャラ的话,用冰属性的这把是没错的。当然后期怪物优先使用火属性的ディア=ルテミス。 最后,讲了那么多,比较一下40多分钟+挂两次+弹尽粮绝的惨状和同样的防具只换了武器12分钟只用蓝色箱子提供的应急药就完成任务,差别非常得大,不得不佩服战术的重要性。
-
mh4狩猟日記1
9月30日入手,十一开始玩的,竟然已经玩了那么长时间。 上手花了好长时间!真的好长好长! 莫名其妙选了操虫棍用到了现在,这种远近即可还能到处跳的好武器就被我歪打正着的选为默认武器了~ 不过我玩这种游戏一般只会躲,绕着怪物满地图跑。所以,所以我很少一个人打大型怪物~ =。= 买了两张看来是正确的~有人带我玩我放心了很多,上周顺利升入HR2~ 不过,这游戏对我来说就是第二个动森……我会忍不住冲动到处打素材做装备…… 然后就没钱了…… 没钱了就拽着XY去打集会所任务挣钱打素材,回来做装备,然后又没钱了……一直这样循环。 嘛~嘛~ 反正只要吼一句「我没钱了,给我买10个XXX(素材、药剂、工具等)吧~」某人肯定会乖乖献上的~ MH4比我想象中好玩,前提是有人一起联机的话~
-
怪物猎人4终于到HR2了
十月初入手怪物猎人4,到现在为止大概三个星期,终于升级到HR2。可能对众多老手来说,这时间太长了点,单人只做关键任务估计几天就行了。但作为一个新手,各方面都在熟悉。以下就是个人玩到现在所了解的内容。 看到很多擦身猎人的等级都是2,7,50等等,我玩了好久还是1。网上搜索了下也没得到满意的答案。但是大致知道关键任务之后HR就会上升。事实上做完集会所影蜘蛛的任务之后HR就升级为2了。 防具分剑士和ガンナー用两种,虽然材料什么的都是一样的。因为一开始的几套都是共用的,所以我以为之后的也都是共用的,结果在造防具的界面上发现提示类型,剑士,好吧,我大致明白了,剑士和ガンナー的衣服是不一样的。 装备的集合,一直都以为只有8套,实际上有5个tab,所以是40套…… item的集合(这个不记得有多少个),在采集任务回来后,因为可能有三页的item,一个个放到box中很慢,建议用item的集合一次load 采集任务提前结束的方法,之前不知道那个票在那里,后来又去网上查了,明白在起点的蓝色箱子……也就是说,任务开始两分钟后蓝色箱子就会多出一张票,把它放到红色箱子中就能提前完成任务。 初期比较囧的一个:不知道怎么换装备。虽然在加工的地方看到好像自己所有武器都有一个,但就是不知道哪里换。后来又去查才知道在自己的房间的box边上换,巨囧…… 不会跳到怪物身上,作为一个新手,不看视频只看提示还真不知道怎么操作,在武器练习中训练多次才会 其实还有很多,部分可以补充到新手指南中去……不管怎么说,穿着推荐的ゲリョス一式(5研磨珠,1无食珠)用着强化前后没啥区别的近衛隊専用盾斧(チャージアックス)总算组团把蜘蛛给干掉了。
-
[fabric]多种策略的工程同步
继续接上篇。 理论上来说,rsync是最好的工程同步方式。只是和fabric自身的ssh登录没有整合,现在我找到了一个简单的解决方法。同时我也准备了其他两种方法:打包上传和远程svn update,这样加上不同步总共有四个部署策略。 解决rsync依赖主机名和密码的方法很简单:因为rsync是在本地运行,只要在rsync之前执行一个简单的远程命令就能获得主机名和密码。代码如下: remote_srcdir = ‘source’ run(‘hostname’) # simple workaround for host prompt local(‘sshpass -p %s rsync -pthrvz –delete –exclude=.git –exclude=*fabfile* –exclude=target . %s:%s’ % (env.password, env.host_string, remote_srcdir)) 这里写死是密码登录了,理论还有证书登录,暂时不考虑。 打包上传的方式,改造自upload_project import tempfile, os remote_srcdir = ‘source’ _, archive_path = tempfile.mkstemp() _, archive_name = os.path.split(archive_path) try: local(‘tar -cz –exclude-vcs –exclude=*fabfile* –exclude=target -f %s .’ %…