美文网首页codewar训练册
codewar系列--Directions Reduction

codewar系列--Directions Reduction

作者: 小懒惰的猪 | 来源:发表于2019-03-21 11:15 被阅读0次
    题目

    题意就是

    一个人被指示从一个地方去另一个地方。方向是“北”、“南”、“西”、“东”。显然,“北”和“南”是对立的,“西”和“东”也是对立的。朝一个方向去,又朝相反的方向回来,这是一种不必要的努力。因为这是蛮荒的西部,天气很糟糕,水也不多,所以一定要节约一些能量,否则你会渴死的!

    你马上就能看到,先“北”再“南”是不合理的,还是呆在原地好!所以任务是给这个人一个简化版的计划。

    (“北”、“南”、“东”、“西”)中,“北”+“南”的方向是向北,然后马上返回。真是浪费时间!最好什么也不做。

    路径变成[东"、"西"],现在"东"和"西"相互湮灭,因此,最终结果是[](Clojure中为nil)。

    在[北"、"东"、"西"、"南"、"西"]中,"北"和"南"不是直接对立的,而是经过"东"和"西"的还原而成为直接对立的,所以整个路径可以还原为[西"、"西"]。

    写一个函数dirReduc,它将取一个字符串数组,并返回一个字符串数组,去掉不必要的方向(W<->E或S<->N并排)。

    Haskell版本采用一个方向列表,数据方向=北|东|西|南。当路径被还原为空时,Clojure版本返回nil。锈版采用了一个切片枚举方向{北,南,东,西}。

    并不是所有的路径都可以简化。这条路(“北”、“西”、“南”、“东”)是不可简化的。“北”与“西”、“西”与“南”、“南”与“东”不是直接对立的,不可能成为对立的。因此,结果路径本身就是:[“北”、“西”、“南”、“东”]


    拿到题的那一刻我是懵的,但是仔细想一想,思路也很简单:就是找到数组中相邻元素对立的值,消除相邻元素,最后返回数组。

    于是我找到一个办法,就是利用栈的原理,在栈中先推进数组一个元素,将数组第二个元素同推进栈的第一个元素的值做对比,相反则推出栈的第一个元素,消除数组中已对比的俩元素;不相反则推第二个元素进栈。依次比较到数组最后一个元素,最后返回栈内的元素。

    我的写法

    我利用了加法,相反元素相加为0。最后虽然得到了正确的结果,但是从字面上看对阅读者实在不友好😰,接下来看看大神们怎么做吧。

    best practice的做法,贴上来几个:

    利用了array.reduce()

    array.reduce()我就不说了,给个链接:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce

    这个做法很聪明,数组转换成字符串,用正则表达式将符合条件的替换成‘’ 这个做法循环调用dirReduc方法,删除符合条件的元素,最后返回剩余数组

    相关文章

      网友评论

        本文标题:codewar系列--Directions Reduction

        本文链接:https://www.haomeiwen.com/subject/xjzfvqtx.html