Python和Ruby,一个诞生于1990年,一个诞生于1995年,当然你可以说蛇叔1989年就在开发Python了,也可以说Matz是1993年就开始开发Ruby了。两种语言都是能让学生感到快乐的动态类型脚本语言,一个靠4个空格,一个靠end来区分层次,非常优雅且美丽。Ruby里一切都是对象。且两种语言都支持duck typing,非常的灵活,灵活到让你无法控制他们的美丽。
但有一件巧合的事让我十分在意,Ruby诞生于日本,Python诞生于荷兰,而历史上日本一直闭关锁国,却在国内允许人们研究荷兰的科学技术,俗称兰学。当然我不是说Matz向Guido借鉴了什么,但我想说,这两个国家的人民是真爱专研。Ruby因为Rails名声大噪,但现在已被所有的大公司弃用,要是日本人能像巴西人那样卖力的推广Lua,也不至于没落。我学习Ruby纯粹是出于Leetcode做题时用Ruby的语法糖真是太甜了,真的很方便,同时借助creek gem读取Excel数据也很方便。我完全没有用到Ruby去进行web开发,也完全不懂元编程的知识,因为到了今天我仍不知道Javascript是怎样在网页里工作的,尽管JSON.parse解析url数据玩的飞起。
今天Leetcode的每日一题,在之前Ruby的Algorithm gem没有被Leetcode官方允许使用的时候,我以为只有Python的顺序容器能解。
2349. 设计数字容器系统
这是Python解
from sortedcontainers import SortedSet
class NumberContainers:
def __init__(self):
self.m = {}
self.ms = defaultdict(SortedSet)
def change(self, index: int, number: int) -> None:
if index in self.m:
self.ms[self.m[index]].remove(index) # 移除旧数据
self.m[index] = number
self.ms[number].add(index) # 添加新数据
def find(self, number: int) -> int:
s = self.ms[number]
return s[0] if s else -1
然而今天Ruby的Algorithm gem已被官方引用,于是我开心的用Ruby解答了。
class NumberContainers
def initialize()
@h1 = {}
@h2 = {}
end
=begin
:type index: Integer
:type number: Integer
:rtype: Void
=end
def change(index, number)
if @h1.has_key?(index)
t = @h1[index]
@h2[t].delete(-index)
if @h2[t].size == 0
@h2.delete(t)
end
@h1[index] = number
else
@h1[index] = number
end
unless @h2.has_key?(number)
@h2[number] = Containers::PriorityQueue.new
@h2[number].push(index, -index)
else
@h2[number].push(index, -index)
end
end
=begin
:type number: Integer
:rtype: Integer
=end
def find(number)
unless @h2.has_key?(number)
return -1
else
t = @h2[number].pop
@h2[number].push(t, -t)
return t
end
end
end
# Your NumberContainers object will be instantiated and called as such:
# obj = NumberContainers.new()
# obj.change(index, number)
# param_2 = obj.find(number)
今天Ruby和Python又再一次东西合璧了,开心。