新手问题 正负抵消的删除

bluexuemei · 2015年01月23日 · 最后由 billy 回复于 2015年01月24日 · 2235 次阅读

arr=[['a',2],['a',2],['a',-2],['b',3],['b',-3],['c',4]],要求将同种类中的正负抵消的项成对消除 result=[['a',2],['c',4]] 请指教!

为了证明你自己不是伸手党,请告诉大家你研究的结果,以及你自己的方案,以及你自己遇到的问题?

#1 楼 @lgn21st ,我遇到的问题是怎么只删除一个 ['a',2],而不是全部删除.

#3 楼 @crazyjin ,你这个方法当然不行,请仔细看题。

我寫了個 11 行的方法達成目的,但是實在不好意思貼出來,還是等一行黨出手吧。

#5 楼 @blacktulip ,谢谢帮助,贴出来让我学习学习嘛!

#4 楼 @bluexuemei 我猜最好的办法是绕过这个坑. 为嘛不用 hash, 为嘛不在获取到数据的时候立即计算, 而是累计起来, 到最后才来计算?

#7 楼 @crazyjin ,请把用 HASH 的代码贴上来,我学习学习。

#8 楼 @bluexuemei

@counter = {}

def count key, value
  tmp = @counter[key]
  @counter[key] =  if tmp.nil?
    value
  else
    tmp + value
  end
end

@counter 里边的数据随时都是你要的结果

#9 楼 @blacktulip 哈哈哈哈 你还真跳进去了...

嗟, 来食!

result = []
arr.each{|e|
  if i = result.index([e[0], -e[1]])
    result.delete_at i
  else
    result << e
  end
}

#12 楼 @luikore /me 向大神伸手要了一碗粥

#12 楼 @luikore ,太牛了,谢谢,这个思路太强大了。

#13 楼 @blacktulip 配合"伸手"的主题...

#5 楼 @blacktulip 一行党

arr.inject([]){|r, a| (i = r.index [a[0], -a[1]]) && r.delete_at(i) ? r : r << a} 

#16 楼 @quakewang ,太潇洒了,佩服佩服!

嗟, 来跳坑!

a.sort.join(",").gsub(/(\w),-(\d),\1,\2,?/,"").split(",").each_slice(2).to_a

#19 楼 @blacktulip 不服?上 Github 单挑

#20 楼 @jex 服..怎么敢不服

一行党大战伸手党

需要 登录 后方可回复, 如果你还没有账号请 注册新账号