如何快速的获取数组中的时间段

发布于 2022-09-12 23:43:06 字数 272 浏览 34 评论 0

$arr = [
    [0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1], 
    [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0], 
    [0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0]
]

上面每条数据代表每天0-24点,其中包含两个时间段:12:00-次日15:00、12:00-15:00。如何快速的获取其中的时间段

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

忆悲凉 2022-09-19 23:43:06

可以做以下优化: 优化前时间复杂度O(24N)优化后O(N),其中N位外层数组长度
思路:用数学函数求出整数的前导零和尾随零的个数然后直接算出他的区间
限制条件:

  1. 一天之内只能有一个,且连续时间段
  2. 得把24位的数组存成一个unsigned的32位整数

下面是javascript参考代码

var clz = Math.clz32;
function ctrz(integer){ // 计算尾随0个数
    // 1. 将第一个1之后的高数位全部置为1
    // 00000000000000001000000000001000 => 11111111111111111111111111111000
    integer |= integer << 16;
    integer |= integer << 8;
    integer |= integer << 4;
    integer |= integer << 2;
    integer |= integer << 1;
    // 2. 然后,对该数取反,此时低位的1的个数即为所求
    return 32 - clz(~integer) |0; // `|0`用于保证结果为整数
}

const date = [
0b000000000001111111111111,
0b111111111111111000000000, 
0b000000000001111000000000
]

const getDateSegements = (arr) => {
  return arr.map((v) => {
    const s = clz(v) - 8;
    const e = 23 - ctrz(v);

    return s + "-" + e;
  });
};

getDateSegements(date) //["11-23", "0-14", "11-14"]
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文