触摸精灵吧 关注:11,870贴子:44,857
  • 6回复贴,共1

【答疑】算法: 统计一个一维表里各元素出现的位置

只看楼主收藏回复


源自群里一人的提问
把他的需求稍微变更了下,如下
需求:
统计一个一维表里各元素出现的位置
例如:
testTab = {"a", "b", "a", "a", "b", "c"}
其中,"a"出现的位置为:1,3,4;"b"出现的位置为:2,5;"c"出现的位置为6


IP属地:湖北1楼2015-09-08 23:01回复

    首先思考数据结构,我们需要统计table里出现了哪些元素以及这些元素都在哪些位置出现,因此,可以考虑使用Map集合,也就是键值对的形式来存储结果,键就是出现的元素,值就是一个table,用于存放出现的位置。
    这里顺便说一下,lua里用table来承载各类数据结构,使用起来非常灵活。


    IP属地:湖北2楼2015-09-08 23:06
    回复
      首先,我们来定义这样一个function
      function repeatCount(tab)
      end
      该function内部该如何实现呢?
      首先,判断输入参数的类型,如果不是table,则提示:
      assert(type(tab) == "table", "Input Para Error!")
      然后,定义一个table,用于存储统计结果:
      local countTab = {}
      之后,我们需要对输入参数tab进行遍历:
      for k,v in ipairs(tab) do
      end
      在遍历时,我们需要对每一个遍历结果做什么呢?
      显然,v就是遍历到的元素,k是其索引(也就是该元素的位置)。(这点不理解的请学习ipairs遍历的相关知识)
      如果该元素是第一次进行统计,那么countTab里之前就没有以v的值为键的元素,因此,我们需要添加该键并把位置加入:
      if countTab[v] == nil then
      countTab[v] = {k}
      end
      否则,就把该元素的位置加入:
      else
      table.insert(countTab[v],k)
      最后,把countTab返回就可以了。


      IP属地:湖北3楼2015-09-08 23:16
      回复
        然后,我们定义一个function来打印countTab的结果并测试


        IP属地:湖北4楼2015-09-08 23:18
        回复

          输出的结果和预期一样
          这里可以发现,输出的顺序是不确定的,这是什么原因呢?大家可以思考下。


          IP属地:湖北5楼2015-09-08 23:20
          收起回复
            火钳刘明呀。后面再看。


            IP属地:四川6楼2015-09-09 00:26
            回复