首頁  >  問答  >  主體

javascript - python小演算法

有個日期字串list,如下:


lst = ['2017-06-01', '2017-06-08', '2017-06-15', '2017-06-22', '2017-06-29', ...]

s = ['2017-06-09']lst中哪一個日期字串最相近

思路1:將s和lst的值轉換成日期,遍歷比較相差的秒數,最小的就是要找的日期字串。

有沒有更好的實作方法? ?

曾经蜡笔没有小新曾经蜡笔没有小新2683 天前1129

全部回覆(3)我來回復

  • typecho

    typecho2017-06-15 09:23:43

    我給個思路給你參考下
    lst.append(s)
    lst.sort()
    num=lst.index(s)
    然後比較lst[num-1]和lst[num+1]這兩個相差的秒數,小的一個就是結果,這樣就不用遍歷算時間戳了。
    覺得不錯就給贊加採納吧。

    回覆
    0
  • 漂亮男人

    漂亮男人2017-06-15 09:23:43

    將日期通過去掉-轉換為整數, 再分別與s中日期相減,得到絕對值最小的數為最相近的日期.

    
    # Python code
    lst = ['2017-06-01', '2017-06-08', '2017-06-15', '2017-06-22', '2017-06-29']
    s = ['2017-06-09']
    date = [''.join(x.split('-')) for x in lst]
    datetoint = [int(x) for x in date]
    gaps = [abs(x - int(''.join(s[0].split('-')))) for x in datetoint]
    mostrecentdate = lst[gaps.index(min(gaps))]
    print(mostrecentdate)

    回覆
    0
  • 伊谢尔伦

    伊谢尔伦2017-06-15 09:23:43

    感覺lz的意思是不要遍歷lst,不管是sort還是通減其實都發生了遍歷
    應該用二分法吧,大概是這意思

    i = 0
    j = len(list)
    while True:
        index = (i + j) / 2
        if s > lst[index]:
            i = index
        else:
            j = index
        continue

    就當偽碼看了,反正是這意思,這樣遍歷次數最少。

    回覆
    0
  • 取消回覆