每日两题 T35
算法
LeetCode T33. 搜索旋转排序数组[1]
描述
假设按照升序排序的数组在预先未知的某个点上进行了旋转。
( 例如,数组 [0,1,2,4,5,6,7]
可能变为 [4,5,6,7,0,1,2]
)。
搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1
。
你可以假设数组中不存在重复的元素。
你的算法时间复杂度必须是 O(log n) 级别。
示例1 :
输入: nums = [4,5,6,7,0,1,2], target = 0
输出: 4
示例2:
输入: nums = [4,5,6,7,0,1,2], target = 3
输出: -1
分析
使用二分法即可完成,当然JavaScript中的数组方法 index
已实现该功能,见代码二。
代码
/**
* @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
};
代码二
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/
- UWP基础教程 - 调起应用的几种方法
- Go语言的网络编程简介
- 你与敬业福还差一个yxcms app漏洞的距离
- Gopher面试中的Coding
- golang 标准库间依赖的可视化展示
- 静态变量和实例变量的区别(配图解释专业术语,通俗易懂)
- 论golang是世界上最好的语言
- 用shape画内圆外方,形成一个圆形头像
- 在Go中对gRPC+ProtoBuf与Http+Json进行基准测试
- Achartengine.jar绘制动态图形一 --饼图
- 工具| 关于Python线程和队列使用的小思考
- Java中list<Object[]>、list<Student>、list<Map<String,String>>排序
- Java-单例模式详解(图文并茂,简单易懂)
- Fragment生命周期及实现点击导航图片切换fragment,Demo
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 以OpenResty搭建RTB竞价引擎接入层
- 优化Linux bootloader速度的究极之路:从GRUB到EFI Stub
- Linux--nc命令
- Netty之美--I/O模型
- 023.基于IT论坛案例学习Elasticsearch(二):Query高级知识(一)
- 打卡群刷题总结0807——验证二叉搜索树
- 打卡群刷题总结0808——二叉树的层序遍历
- Mybatis高级查询(四):延迟加载
- I/O多路复用器之隐秘的角落
- 打卡群刷题总结0809——二叉树的锯齿形层次遍历
- 简单的ssm整合练手项目:汽车项目
- 在spring-boot中使用pageHelper插件
- 要深入 JavaScript,你需要掌握这 36 个概念
- mybatis-plus实现增删改查
- mybatis-plus代码生成器