Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >每日两题 T35

每日两题 T35

作者头像
合一大师
发布于 2020-07-20 01:52:19
发布于 2020-07-20 01:52:19
88500
代码可运行
举报
文章被收录于专栏:JavaScript全栈JavaScript全栈
运行总次数:0
代码可运行

算法

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

描述

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

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

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

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

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

示例1 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入: nums = [4,5,6,7,0,1,2], target = 0
输出: 4

示例2:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入: nums = [4,5,6,7,0,1,2], target = 3
输出: -1

分析

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

代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * @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
代码运行次数:0
运行
AI代码解释
复制
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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
React saga_react获取子组件ref
React的作用View层次的前端框架,自然少不了很多中间件(Redux Middleware)做数据处理, 而redux-saga就是其中之一,目前这个中间件在网上的资料还是比较少,估计应用的不是很广泛,但是如果使用得当,将会事半功倍的效果,下面仔细介绍一个这个中间件的具体使用流程和应用场景。
全栈程序员站长
2022/09/27
4.8K0
React saga_react获取子组件ref
状态管理的概念,都是纸老虎
不管是Vue,还是 React,都需要管理状态(state),比如组件之间都有共享状态的需要。什么是共享状态?比如一个组件需要使用另一个组件的状态,或者一个组件需要改变另一个组件的状态,都是共享状态。
Nealyang
2021/04/20
5.5K0
单向数据流-从共享状态管理:flux/redux/vuex漫谈异步数据处理
不管是Vue,还是 React,都需要管理状态(state),比如组件之间都有共享状态的需要。
周陆军
2021/08/07
4K0
高级前端react面试题总结
(1)不要在循环,条件或嵌套函数中调用Hook,必须始终在 React函数的顶层使用Hook
beifeng1996
2022/12/15
4.6K0
2021高频前端面试题汇总之React篇
合成事件是 react 模拟原生 DOM 事件所有能力的一个事件对象,其优点如下:
zz1998
2021/09/23
2.4K0
React:Redux怎么处理异步?
redux-thunk 中间件允许你 dispatch 一个函数(即:thunk),异步逻辑就放在这个函数中处理;
WEBJ2EE
2019/07/19
2.8K0
React:Redux怎么处理异步?
一天梳理完react面试高频题
路由匹配是通过比较 <Route> 的 path 属性和当前地址的 pathname 来实现的。当一个 <Route> 匹配成功时,它将渲染其内容,当它不匹配时就会渲染 null。没有路径的 <Route> 将始终被匹配。
beifeng1996
2022/10/11
4.7K0
美团前端react面试题汇总
服务端渲染是数据与模版组成的html,即 HTML = 数据 + 模版。将组件或页面通过服务器生成html字符串,再发送到浏览器,最后将静态标记"混合"为客户端上完全交互的应用程序。页面没使用服务渲染,当请求页面时,返回的body里为空,之后执行js将html结构注入到body里,结合css显示出来;
goClient1992
2022/09/13
5.6K0
2021高频前端面试题汇总之React篇
React并不是将click事件绑定到了div的真实DOM上,而是在document处监听了所有的事件,当事件发生并且冒泡到document处的时候,React将事件内容封装并交由真正的处理函数运行。这样的方式不仅仅减少了内存的消耗,还能在组件挂在销毁时统一订阅和移除事件。
zz1998
2021/09/15
2.3K0
前端高频react面试题
以 store 为核心,可以把它看成数据存储中心,但是他要更改数据的时候不能直接修改,数据修改更新的角色由Reducers来担任,store只做存储,中间人,当Reducers的更新完成以后会通过store的订阅来通知react component,组件把新的状态重新获取渲染,组件中也能主动发送action,创建action后这个动作是不会执行的,所以要dispatch这个action,让store通过reducers去做更新React Component 就是react的每个组件。
beifeng1996
2022/12/16
3.9K0
redux-saga_pub culture
项目链接: https://github.com/fanxiao168/React-todoList 什么是Redux Saga
全栈程序员站长
2022/11/04
1.6K0
Redux:从action到saga
该文章讲述了如何使用 Redux 和 Redux Saga 管理应用程序的状态和行为。通过使用 Redux,可以轻松地将状态存储在全局变量中,并在组件之间轻松共享数据。Redux Saga 是一种异步处理程序,可以处理异步操作,例如网络请求,从而提高应用程序的性能。
查理大叔
2017/12/24
1.3K0
Redux 异步解决方案2. Redux-Saga中间件
因为Generator。结合yield  yield操作符会获取右边表达示的值返回 可以用于异步变同步操作 中间件的特性: 以前的 action -> reducers -> store 现在的 action -> middleware -> reducers -> store
憧憬博客
2020/07/21
1.1K0
前端react面试题(必备)2
this.props是组件之间沟通的一个接口,原则上来讲,它只能从父组件流向子组件。React具有浓重的函数式编程的思想。
beifeng1996
2023/01/04
2.7K0
react项目架构之路初探
越是用来解决具体问题的技术,使用起来越容易,越高效,学习成本越低;越是用来解决宽泛问题的技术,使用起来越难,学习成本越高。
念念不忘
2019/03/29
2.6K0
react项目架构之路初探
Redux开发实用教程
为了帮助大家快速上手什么是Redux开发,在这本节中将向大家介绍什么是Redux开发所需要的一些什么是Redux必备基础以及高级知识。
CrazyCodeBoy
2019/12/10
1.5K0
Redux开发实用教程
Redux原理分析以及使用详解(TS && JS)
简单说,如果你的UI层非常简单,没有很多互动,Redux 就是不必要的,用了反而增加复杂性。
前端小tips
2021/11/25
5.3K0
Redux原理分析以及使用详解(TS && JS)
深入理解 redux 数据流和异步过程管理
前端框架实现了数据驱动视图变化的功能,我们用 template 或者 jsx 描述好了数据和视图的绑定关系,然后就只需要关心数据的管理了。
神说要有光zxg
2021/09/28
2.7K0
2022社招react面试题 附答案
React的异步请求到底应该放在哪个⽣命周期⾥,有⼈认为在componentWillMount中可以提前进⾏异步请求,避免⽩屏,其实这个观点是有问题的。
用户9264421
2021/12/07
2.4K0
react全家桶包括哪些_react 自定义组件
对于现在比较流行的三大框架都有属于自己的脚手架(目前这些脚手架都是使用node编写的,并且都是基于webpack的):
全栈程序员站长
2022/11/18
6.3K0
react全家桶包括哪些_react 自定义组件
相关推荐
React saga_react获取子组件ref
更多 >
LV.1
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验