前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >每日两题 T35

每日两题 T35

作者头像
合一大师
发布2020-07-20 09:52:19
7510
发布2020-07-20 09:52:19
举报
文章被收录于专栏:JavaScript全栈JavaScript全栈

算法

LeetCode T33. 搜索旋转排序数组[1]

描述

假设按照升序排序的数组在预先未知的某个点上进行了旋转。

( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。

搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1

你可以假设数组中不存在重复的元素。

你的算法时间复杂度必须是 O(log n) 级别。

示例1 :

代码语言:javascript
复制
输入: nums = [4,5,6,7,0,1,2], target = 0
输出: 4

示例2:

代码语言:javascript
复制
输入: nums = [4,5,6,7,0,1,2], target = 3
输出: -1

分析

使用二分法即可完成,当然JavaScript中的数组方法 index 已实现该功能,见代码二。

代码

代码语言:javascript
复制
/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
var search = function(nums, target) {
  let l = 0
  let r = nums.length - 1
  while(l <= r){
    let mid = l + ((r - l) >> 1)         // 取中间索引
    if(nums[mid] === target) return mid  // 找到了 直接返回

    if(nums[l] <= nums[mid]){            // 如果第一个元素 小于等于 中间元素 表示 左边的是增序的 如[4,5,6,7,0,1,2]

      // 如果target 小于 中间元素, 大于第一个元素 ,说明target处于 [l, mid]间
      if(nums[mid] > target && nums[l] <= target){  
        r = mid - 1
      } else {  // 否则处于 [mid + 1, r]中
        l = mid + 1
      }

    } else {                            // 否则 右边是增序的 如[6,7,0,1,2,4,5]

      // 如果target 大于中间元素 小于最后元素, 说明处于[mid + 1, r]中
      if(nums[mid] < target && nums[r] >= target){   
        l = mid + 1
      } else {  // 否则处于[l, mid - 1]中
        r = mid - 1
      }

    }
  }
  // 没找到
  return -1
};

代码二

代码语言:javascript
复制
var search = function (nums, target) {
  return nums.indexOf(target);
};

前端

为什么要用redux-saga?看过dva源码吗?

redux

redux是 JavaScript 状态容器,提供可预测化的状态管理。

应用中所有的 state 都以一个对象树的形式储存在一个单一的 store 中。惟一改变 state 的办法是触发 action,一个描述发生什么的对象。为了描述 action 如何改变 state 树,你需要编写 reducers。

你应该把要做的修改变成一个普通对象,这个对象被叫做 action,而不是直接修改 state。然后编写专门的函数来决定每个 action 如何改变应用的 state,这个函数被叫做 reducer。

redux 有且仅有一个 store 和一个根级的 reduce 函数(reducer)。随着应用不断变大,你应该把根级的 reducer 拆成多个小的 reducers,分别独立地操作 state 树的不同部分,而不是添加新的 stores。这就像一个 React 应用只有一个根级的组件,这个根组件又由很多小组件构成。

redux-saga

redux-saga 是一个用于管理应用程序 Side Effect(副作用,例如异步获取数据,访问浏览器缓存等)的 library,它的目标让副作用管理更容易,执行更高效,测试更简单,在处理故障时更容易

可以想像为,一个 saga 就像是应用程序中一个单独的线程,它独自负责处理副作用。redux-saga 是一个 redux 中间件,意味着这个线程可以通过正常的 redux action 从主应用程序启动,暂停和取消,它能访问完整的 redux state,也可以 dispatch redux action。

redux-saga 使用了 ES6 的 Generator 功能,让异步的流程更易于读取,写入和测试。(如果你还不熟悉的话,这里有一些介绍性的链接) 通过这样的方式,这些异步的流程看起来就像是标准同步的 Javascript 代码。(有点像 async/await,但 Generator 还有一些更棒而且我们也需要的功能)。

你可能已经用了 redux-thunk 来处理数据的读取。不同于 redux thunk,你不会再遇到回调地狱了,你可以很容易地测试异步流程并保持你的 action 是干净的。

redux-saga与其他redux中间件比较

•redux-thunk 的缺点在于api层与store耦合,优点是可以获取到各个异步操作时期状态的值,比较灵活,易于控制

•redux-promise的优点是api层与store解耦,缺点是对请求失败,请求中的情形没有很好的处理

•redux-saga 的优点是api层与store解耦,对请求中,请求失败都有完善的处理,缺点是代码量较大

References

[1] 33. 搜索旋转排序数组: https://leetcode-cn.com/problems/search-in-rotated-sorted-array/

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-04-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 JavaScript全栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 算法
    • LeetCode T33. 搜索旋转排序数组[1]
      • 描述
        • 分析
          • 代码
            • 代码二
            • 前端
              • 为什么要用redux-saga?看过dva源码吗?
                • redux
                  • redux-saga
                    • redux-saga与其他redux中间件比较
                      • References
                      相关产品与服务
                      消息队列 TDMQ
                      消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
                      领券
                      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档