另外 leetcode 的测试代码大部分是来自 C 的,ruby 的数字没有超界问题,有一些就可以投机了 比如 Factorial Trailing Zeroes,就可以一行解掉:
def trailing_zeroes(n)
(1..13).to_a.map{|i| n / 5 ** i}.inject(:+)
end
还可以利用强大的内置对象,比如 count primes,require 一下,也是一行解掉
require 'prime'
def count_primes(n)
Prime.each(n - 1).to_a.size
end
^_^
再抽了几个题目看一下,我觉得你写的代码太不像 ruby 了...
你的 https://github.com/acearth/LeetCodePractice/blob/master/isomorphic.rb 18 行
可以用 hash 的 uniq keys 来判断,3 行解掉:
def is_isomorphic(s, t)
h = {}
s.chars.each_with_index{|c, i| h[c] ||= t[i]; return false if h[c] != t[i]}
return h.keys.uniq.size == h.values.uniq.size
end
https://github.com/acearth/LeetCodePractice/blob/master/compareVersion.rb 30 多行
可以用 ruby 的数组<=>操作,8 行解掉:
def compare_version(version1, version2)
v1 = version1.split('.').map(&:to_i)
v2 = version2.split('.').map(&:to_i)
if v1.size > v2.size
v2 += [0] * (v1.size - v2.size)
elsif v2.size > v1.size
v1 += [0] * (v2.size - v1.size)
end
v1 <=> v2
end
Happy Number 你的解法,116ms
def is_happy(n)
a=n.to_s
a=a.to_s
k=0
while true
ss=a.to_s
d=0
ss.length.times do |i|
di=ss[i].to_i
d+=di**2
end
a=d
return true if d==1
k+=1
return false if k>100
end
end
多用 hash,96ms
def is_happy(n)
hash = {}
while hash[n].nil? do
n = hash[n] = n.to_s.chars.inject(0){|m, c| m + c.to_i * c.to_i}
end
n == 1
end
看了第一题 Two Sum 你的解法 800 多 ms
def two_sum(nums, target)
pro=Hash.new
nums.length.times do|i|
pro[nums[i]]=i+1
end
nums.length.times do|i|
k=target-nums[i]
if nums.include? k
if(i+1 != pro[k])
return [i+1,pro[k]]
end
end
end
end
加个 hash 来记录,性能会好很多,80 多 ms
def two_sum(numbers, target)
hash = numbers.map.with_index.to_h
found = numbers.find.with_index do |n, index|
target_index = hash[target - n] and target_index != index
end
[numbers.index(found) + 1, hash[target - found] + 1].sort
end
是一元运算符(Unary Operator) 比如你在 irb 里面执行 -[1, 2, 3] 会得到错误 NoMethodError: undefined method `-@' for [1, 2, 3]:Array
你可以给 Array 定义这个一元运算符:
class Array
def -@
self.reverse
end
end
-[1,2,3]
# => [3, 2, 1]
有现成轮子可以用啊
require 'ice_cube'
s1 = IceCube::Schedule.new(Time.parse('2015-07-08 16:00:00'), duration: 3600)
s2 = IceCube::Schedule.new(Time.parse('2015-07-06 16:00:00'), duration: 1800) do |s|
s.add_recurrence_rule(IceCube::Rule.daily)
end
s1.conflicts_with?(s2)
#=> true
手工点赞
试试看这个 sql parser https://github.com/cryodex/sql-parser
基于 racc 生产的 parser,复杂 sql 无法解析的话,自己修改 racc 文件。
不过,我还是没明白这样的需求实际用途是什么...
70~80 平米的房间是放不下 30 人的...
我们之前 30 个人,用的实用面积大概有 100 平米吧,已经觉得蛮挤了
我们是配置了 3 台无线路由 (NETGEAR R6300) + 1 台入门级思科 24 口交换机。内网服务器不一定要用服务器,普通家用 PC 就可以了,做好备份即可。
也可以直接用 AR 的 Single table inheritance
class Order < ActiveRecord::Base
end
class OrderFoo < Order
def pay
end
end
class OrderBar < Order
def pay
end
end
create_table :orders do |t|
t.string :type
end
monkey patch ActiveRecord::Timestamp 的 timestamp_attributes_for_create / timestamp_attributes_for_update 方法
https://github.com/rails/rails/blob/master/activerecord/lib/active_record/timestamp.rb#L93
将 [:created_at, :created_on] 替换成 [:create_time]
动态用主动拉的话,直接查询动态表不行吗?
select * from activities where user_id in (select user_id from followers where follower_id = CURRENT_USER_ID) and id > LAST_VIEW_ID
3d 打印一个吧
upyun 现在不是有 cdn 功能吗?在 upyun 那边配置一个源地址就可以了。
mina 和 capistrano 相比,速度快非常多,现在我们一些小项目都用它,1~3 台服务器的规模,不过大规模部署的话比 cap 有一些缺点:
不支持多台服务器并行部署,得手写一个 task,串行调用
set :domains, %w[10.xx.xx.3 10.xx.xx.4 10.xx.xx.5]
task :deploy_all do
isolate do
domains.each do |domain|
set :domain, domain
invoke :deploy
run!
end
end
end
而实际上有些任务只需要在一台服务器上运行,比如 db migrate,比如 asset precomplie(有 CDN 的情况),考虑到这些情况,手写的 task,就变成和 cap 类似 role 的样子了。还要考虑到如果其中一台部署出错,要 rollback 之前已经部署过的服务器,脚本就更加复杂了。服务器数量如果大于 5 台的话,一台一台部署,速度上并没有比 cap 的并行部署来得快。
不支持 gateway 的方式,解决方法是在 gateway 上执行 mina,而不是直接在客户端执行。
用户量比 cap 少,会遇到一些生产中的 bug,比如这个 unicorn 的插件,在这个 commit 之前没有考虑到 gem file 改变的情况: https://github.com/scarfacedeb/mina-unicorn/commit/e7c331ab4566eff149a4ffabde73b8ba6b1fa202
会导致 gem file 改变以后,无法链接到最新的,导致 unicorn 重启失败。
不过在小规模运用上 mina 还是完胜 cap
做过类似的,输入 POI 的名字,用地图 api 搜索出相关的地点,显示在地图上,用户点击具体点,如果确认无误,经纬度入库既可以。
如果状态只有审核和非审核,通常我会用时间:published_at,默认创建出来是 published_at 是 nil,审核过了,设置为 Time.now
如果有 2 种以上的状态,可以考虑用 state machine
discuz 和 phpbb 用的是一样的 tag 吗?试试看这个 https://github.com/cpjolicoeur/bb-ruby
安装尝鲜了一下。
经常用 rvm 更新 ruby 版本的,顺带就自动更新 gem 版本了
不交税,只要一次没超过限额,按汇率换算成 RMB 好像是 1 万(可能不准确),就直接入账了