-
2022-02-11 11:19:03
场景:
有时候后端给我们的数据 我们不能直接使用展示,这时我们不得不去过滤一下得到我们想要的结果.
-------------------------------------------------------------------------------------------
情况 :
😊简单的过滤我们可以直接写个if else if去替换,但是往往我们都需要请求接口对应字典表去查找😔.
-------------------------------------------------------------------------------------------
解决:
我们可以简单写几个循环去查找 ,但是这种新能不佳且不容易阅读和通用性不强,💪我们这个时候就要使用递归去解决
-------------------------------------------------------------------------------------------
那我们废话不多说,直接上菜👇:
let array = [ {value:1,label:"A",children:[ {value:1,label:"A"}, {value:8,label:"yes"}, ]}, {value:2,label:"B"}, {value:3,label:"C"}, ] // 过滤 /** * array:后端字典 * areaId:查询条件 */ FiltersFn(array, areaId) { let re= null; for (let i in array) { // 条件成立时刻 if (array[i].value == areaId) { re= array[i].label; break; } if (array[i].children instanceof Array && array[i].children.length > 0) { //存在子节点就递归 const result= FiltersFn(array[i].children, areaId); if (result) { return result; } } } return re; }, console.log(FiltersFn(array,8)) //======> yes
更多相关内容 -
python筛选excel符合条件的数据——python处理excel数据(四)
2021-04-27 14:38:16情景:当我们需要从excel表中筛选出符合某个条件的数据,例如我们需要从附加标签中筛选出2班的行数据 import xlrd import xlwt #需处理的文件名 file = '0422.xlsx' #读取文件 data = xlrd.open_workbook(file...情景:当我们需要从excel表中筛选出符合某个条件的数据,例如我们需要从附加标签中筛选出2班的行数据
import xlrd import xlwt #需处理的文件名 file = '0422.xlsx' #读取文件 data = xlrd.open_workbook(file) #读取要处理的表名 table = data.sheet_by_name("1") nrows = table.nrows#行数 ncols = table.ncols#列数 print(nrows-1) #添加表头 workbook = xlwt.Workbook(encoding='utf-8') new_sheet=workbook.add_sheet('test') data = input('输入你想要筛选的数据,format(#2班)\n') #data1 = input('输入第几列,format(3)\n') rank_list = [] for i in range (1,nrows): if table.row_values(i)[6]==data: #筛选第几列就改 [1] 里的数字 rank_list.append(i) print(rank_list) #写表头 for i in range(ncols): new_sheet.write(0,i,table.cell(0,i).value) for i in range(len(rank_list)): for j in range(ncols): new_sheet.write(i+1, j, table.cell(rank_list[i],j).value) workbook.save('shaixuanhou.xls')
输出结果如下
-
数据结构专题(一)二分法,寻找解题思路看这一篇就够了
2020-12-29 19:02:31初始条件:left = 0, right = length 因为数组从下标0开始,所以实际代码中可以是 num.length - 1 终止:left 向左查找:right = mid 这是因为向右判断,一般需要保留比较元素,否则某些晴情况下会丢失数据 ...二分法
二分法又可以被称为二分查找,它描述了在有序集合中搜索特定值的过程。广义的二分查找是将问题的规模尽可能的缩小到原有的一半。
对于二分法的思想大家都能讲出几句,但我们仍然很难讲其与实际应用完美的结合到一起,所以我们尽量汇总二分法的应用场景,和大家一起深入,共勉!
一、常见问题
给定一个由数字组成的有序数组
nums
,并给你一个数字target
。问nums
中是否存在target
。如果存在,则返回其在nums
中的索引。如果不存在,则返回 - 1。这是二分查找中最简单的一种形式。当然二分查找也有很多的变形,这也是二分查找容易出错,难以掌握的原因。
常见变体有:
- 如果存在多个满足条件的元素,返回最左边满足条件的索引。
- 如果存在多个满足条件的元素,返回最右边满足条件的索引。
- 数组不是整体有序的。 比如先升序再降序,或者先降序再升序。
- 将一维数组变成二维数组…等等
二、二分查找中使用的术语
如前所述,二分查找是一种在每次比较之后将查找空间一分为二的算法。每次需要查找集合中的索引或元素时,都应该考虑二分查找。如果集合是无序的,我们可以总是在应用二分查找之前先对其进行排序。但要注意排序的成本
target
: 要查找的值index
: 查找时的当前位置left
和right
: 左右指针mid
: 左右指针的中点,用来确定我们应该向左查找还是向右查找的索引
在最简单的形式中,二分查找对具有指定左索引和右索引的连续序列进行操作。这就是所谓的查找空间。二分查找维护查找空间的左、右和中间指示符,并比较查找目标或将查找条件应用于集合的中间值;如果条件不满足或值不相等,则清除目标不可能存在的那一半,并在剩下的一半上继续查找,直到成功为止。如果查以空的一半结束,则无法满足条件,并且无法找到目标。
注意:
- 二分法搜索可以采用许多替代形式
- 可能并不总是直接搜索特定值
- 你不一定能直接缩小一半的查找范围
- …
看过之后的几个模版,并结合配套的例题,相信你会有自己的想法。
三、模版 I - 基础二分查找
模版 I 是基础的二分查找,用于查找可以通过访问数组中的单个索引来确定的元素或条件。
3.1 复杂度分析
- 平均时间复杂度:
O(logN)
- 最坏时间复杂度:
O(logN)
- 最优时间复杂度:
O(1)
3.2 关键点
- 二分查找的最基础和最基本的形式。
- 查找条件可以在不与元素的两侧进行比较的情况下确定(或使用它周围的特定元素)。
- 不需要后处理,因为每一步中,你都在检查是否找到了元素。如果到达末尾,则知道未找到该元素。
3.3 区分语法
- 初始条件:
left = 0
right = arrar.length-1 或 number
- 终止:
left > right
- 向左查找:
right = mid-1
- 向右查找:
left = mid+1
3.4 javascript 基础模版
var search = function(nums, target) { left = 0; // 初始左边界 right = nums.length - 1; // 初始右边界 while (left <= right) { let mid = left + Math.floor((right - left) / 2); //防止溢出 if (nums[mid] < target) { // 收缩左边界 left = mid + 1; } else if (nums[mid] > target) { // 收缩右边界 right = mid - 1; } else { return mid; // 找到了当前值 } } return -1; };
3.5 代码分析
- 确定初始的左右边界:
left
: 0right
: nums.length-1mid
: (left + (right - left) >> 1)
- 如果中间元素值
nums[mid]
< target:证明中间值左侧包括中间值都不符合要求,可以直接排除,left = mid + 1
- 如果中间元素值
nums[mid]
:证明中间值右侧包括中间值都不符合要求,可以直接排除,right = mid - 1
- 如果中间元素值
nums[mid]
= target:直接返回mid
的下标 - 重新定义了左右边界,也需要重新计算中间值,我们需要继续进行范围的排除
- 定义搜索的条件,应该是搜索区间都不为空,即
left <= right
3.6 LeetCode 实战
下面五题,难度递增,每篇题解都包含原题链接、模版分析、Js 题解,大家可以放心食用,我们一起加油~
四、模版 II - 依赖当前元素与右元素的关系
模板 II 是二分查找的高级模板。它用于查找需要访问数组中当前索引及其直接右邻居索引的元素或条件。
4.1 关键点
- 查找条件需要访问元素的直接右邻居。
- 使用元素的右邻居来确定是否满足条件,并决定是向左还是向右。
- 保证查找空间在每一步中至少有 2 个元素。
- 需要进行后处理。 当你剩下 1 个元素时,循环 / 递归结束。 需要评估剩余元素是否符合条件。
4.2 区分语法
- 初始条件:
left = 0, right = length
因为数组从下标0开始,所以实际代码中可以是 num.length - 1 - 终止:
left <= right
- 向左查找:
right = mid
这是因为向右判断,一般需要保留比较元素,否则某些晴情况下会丢失数据 - 向右查找:
left = mid+1
4.3 javascript 基础模版
var search = function(nums, target) { left = 0; // 初始左边界 right = nums.length - 1; // 初始右边界 while (left <= right) { var mid = left + Math.floor(left + (right - left) / 2); //防止溢出 if (target == nums[mid]) { right = mid + 1; // 继续寻找左侧是否仍存在满足条件的元素,但包含当前元素 } else if (nums[mid] < target) { left = mid + 1; } else { right = mid - 1; } } if (left != nums.length && nums[left] === target) return left; return -1; };
4.4 代码分析
首先定义搜索区间为 [left, right],注意是左右都闭合,之后会用到这个点。
- 终止搜索条件为 left <= right。
- 循环体内,我们不断计算 mid ,并将 nums[mid] 与 目标值比对。
- 如果 nums[mid] 等于目标值, 则收缩左边界,注意它此时不代表最终结果
- 如果 nums[mid] 小于目标值, 说明目标值在 mid 右侧,这个时候搜索区间可缩小为 [mid + 1, right]
- 如果 nums[mid] 大于目标值, 说明目标值在 mid 左侧,这个时候搜索区间可缩小为 [left, mid - 1]
- 最后我们要判断 left 值是否等于 target,如果不等于,证明没找到
- 如果 left 出了右边边界了,说明也没有找到
4.5 LeetCode 实战
下面 3 题,难度递增,每篇题解都包含原题链接、模版分析、Js 题解,大家可以放心食用,我们一起加油~
五、模板 III - 依赖当前元素与左右两个元素之间的关系
模板 III 是二分查找的另一种独特形式。它用于搜索需要访问当前索引及其在数组中的直接左右邻居索引的元素或条件。
5.1 关键点
- 实现二分查找的另一种方法。
- 搜索条件需要访问元素的直接左右邻居。
- 使用元素的邻居来确定它是向右还是向左。
- 保证查找空间在每个步骤中至少有 3 个元素。
- 需要进行后处理。当剩下
2
个元素时,循环 / 递归结束。需要评估其余元素是否符合条件。
5.2 区分语法
- 初始条件:
left = 0, right = length - 1
- 终止:
left + 1 === right
- 向左查找:
right = mid
- 向右查找:
left = mid
5.3 javascript 基础模版
function binarySearch(nums, target) { const len = nums.length; if (len === 0) return -1; let left = 0; let right = len - 1; while (left + 1 < right) { let mid = left + ((right - left) >> 1); if (nums[mid] === target) { return mid; } else if (nums[mid] < target) { left = mid; } else { right = mid; } } if (nums[left] == target) return left; if (nums[right] == target) return right; return -1; }
5.4 代码分析
因为我们的判断区间最少为 2 个元素,所以我们要注意循环的执行条件
- 简单的判断边界:
nums.length === 0,return -1
; - 定义初始的左右边界:
left = 0, right = nums.length - 1
; - 确定执行条件:
left + 1 < right
,这也意味着查找区间要存在 3 个元素; - 向左查找时:
right = mid
; - 向左查找时:
left = mid
; - 判断剩下的两个元素哪个符合目标元素,并返回结果;
5.5 LeetCode 实战
下面 3 题,难度递增,每篇题解都包含原题链接、模版分析、Js 题解,大家可以放心食用,我们一起加油~
六、二分查找模板分析
本小结引自于LeetCode二分专题
上面提到的三个模版,大家在做题的时候很难完全套用进去,大部分时候,都是寻找最合适的方式并不断调整
6.1 模版差异
这 3 个模板的不同之处在于:
- 左、中、右索引的分配。
- 循环或递归终止条件。
- 后处理的必要性。
个人感觉模版I最实用(其实是另外两个模版掉头发啊!)
6.2 模版示例
模板I (left <= right)
二分查找的最基础和最基本的形式。
- 查找条件可以在不与元素的两侧进行比较的情况下确定(或使用它周围的特定元素)。
- 不需要后处理,因为每一步中,你都在检查是否找到了元素。如果到达末尾,则知道未找到该元素。
模板II (left < right)
一种实现二分查找的高级方法。
- 查找条件需要访问元素的直接右邻居。
- 使用元素的右邻居来确定是否满足条件,并决定是向左还是向右。
- 保证查找空间在每一步中至少有 2 个元素。
- 需要进行后处理。 当你剩下 1 个元素时,循环 / 递归结束。 需要评估剩余元素是否符合条件。
模板III (left + 1 < right)
实现二分查找的另一种方法。
- 搜索条件需要访问元素的直接左右邻居。
- 使用元素的邻居来确定它是向右还是向左。
- 保证查找空间在每个步骤中至少有 3 个元素。
- 需要进行后处理。 当剩下 2 个元素时,循环 / 递归结束。 需要评估其余元素是否符合条件。
七、其他经典问题
八、写在最后
本文解释了三种最常见的解题模版,并附上LeetCode实战,帮助我们理解二分法这种思想。
如果对你有所帮助不妨给本项目的github 点个 star,这是对我最大的鼓励
关于我
- 花名:余光
- WX:j565017805
- 沉迷 JS,水平有限,虚心学习中
其他沉淀
-
LeetCode题解:寻找峰值
2020-12-15 09:48:40数组可能包含多个峰值,在这种情况下,返回任何一个峰值所在位置即可。 你可以假设 nums[-1] = nums[n] = -∞。 输入: nums = [1,2,1,3,5,6,4] 输出: 1 或 5 解释: 你的函数可以返回索引 1,其峰值元素为 2;或者...寻找峰值(middle)
更好的阅读体验应该是:
- 审题-思考
- 答题
- 整理-归纳
一、题目
峰值元素是指其值大于左右相邻值的元素。
给定一个输入数组
nums
,其中nums[i] ≠ nums[i+1]
,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回任何一个峰值所在位置即可。
你可以假设
nums[-1] = nums[n] = -∞
。输入: nums = [1,2,1,3,5,6,4] 输出: 1 或 5 解释: 你的函数可以返回索引 1,其峰值元素为 2;或者返回索引 5, 其峰值元素为 6。
你的解法应该是
O(logN)
时间复杂度的。二、基础模版 II
- 确定初始的左右边界:
left
: 0right
: nums.length-1mid
: (left + (right - left) >> 1)
- 查找条件需要访问元素的直接右邻居。
- 使用元素的右邻居来确定是否满足条件,并决定是向左还是向右。
- 保证查找空间在每一步中至少有 2 个元素。
- 需要进行后处理。 当你剩下 1 个元素时,循环 / 递归结束。 需要评估剩余元素是否符合条件。
三、题解
分析模版
- 我们的目标是:寻找一段顺序区间内最大的元素
- 我们拥有的访问区间不是顺序的,我们需要自己划分
Javasciprt 代码
/** * @param {number[]} nums * @return {number} */ var findPeakElement = function(nums) { let left = 0; let right = nums.length - 1; while (left < right) { let mid = left + ((right - left) >> 1); // 这里需要保证区间内有2个元素 if (nums[mid] < nums[mid + 1]) { // 这证明 mid + 1 更有可能是当前区间的峰值,并且左侧是递减区间,可以抛弃 left = mid + 1; // } else { // 这证明 mid 更有可能是当前区间的峰值,并且右侧是递减区间,可以抛弃,但注意保留mid right = mid; } } return left; };
四、写在最后
本文是二分查找-模版 II 的第二题,你可能意识到了,相对应的 leetcode 给他们标出中等的难度,加油!
如果对你有所帮助不妨给本项目的github 点个 star,这是对我最大的鼓励~
关于我
- 花名:余光
- WX:j565017805
- 沉迷 JS,水平有限,虚心学习中
其他沉淀
-
MySQL 一个条件查询出数据表中所有满足条件的数据的方法
2017-12-15 17:49:33项目开发中遇到一个问题:搜索框只传入一个条件,在SQL查询的时候如何查询出所有满足条件的数据。想到的第一解决方案是在后端进行逻辑处理的时候进行 if...else...的拼接。 但是拼接多个if...else...也不过是权宜之计... -
pandas使用query函数基于判断条件获得dataframe中满足条件的数据行(row)的索引列表(index of rows ...
2022-01-19 16:14:15pandas使用query函数基于判断条件获得dataframe中满足条件的数据行(row)的索引列表(indexof rows matching conditions in dataframe) -
JS 数组中查找符合条件的数据索引
2020-12-21 00:49:35日常工作中经常会需要我们前端获取后端为我们传递的数据放在页面中渲染的问题。大批量的数据后端会根据具体的情况来放在数组中传递给我们,但是如果遇到数组中有需要特殊需要处理的数据怎么办?原来100个数据,渲染... -
Excel 怎样用VLOOKUP匹配多列数据/excle全部筛选匹配
2020-12-21 11:35:54excel怎么根据一列去筛选另一类的数据1、首先,在两列中要选择数据齐全格作为对比筛选,在表格空白处输入=VLOOKUP,输入后会自动弹出对话框。2表格B2(方便结果对比)中输入=VLOOKUP后,系统自动弹出填充项,输入=... -
怎么在矩阵中挑选符合条件的数据
2017-10-21 16:42:37如果我有一个32000行,51列的数据,我要从每列中挑选出从1250到1350之间的数据,一列...每列在这个范围内的数据可能会不一样多。补充,1250到1350是矩阵中元素的大小范围,不是位置范围 Min = 1250; Max = 1350 -
数据分析之数据预处理、分析建模、可视化
2020-08-08 15:03:21数据预处理:数据清洗、数据集成、数据规约、数据变换; 数据分析模型:对比分析、漏斗分析、留存分析、A/B测试、用户行为路径分析、用户分群、用户画像分析等; 数据分析方法:描述统计、假设检验、信度分析、相关... -
多传感器信息融合(标定, 数据融合, 任务融合)
2020-03-19 09:51:00文章目录 1. 引言 2. 多传感器标定 2.1 标定场地 ... 数据层融合 3.1 融合的传统方法 3.2 深度学习方法 4. 任务层融合 4.1 传统之障碍物检测跟踪 4.2 传统之多传感器定位 4.3 深度学习之障... -
自动驾驶汽车传感器融合系统及多传感器数据融合算法浅析
2018-09-27 16:52:19“自动泊车、公路巡航控制和自动紧急制动等自动驾驶汽车功能在很大程度上是依靠传感器来实现的。...现在路面上的很多汽车,甚至是展厅内的很多新车,内部都配备有基于摄像头、雷达、超声波或LIDAR... -
数据缺失,数据异常,数据标准化的处理方法
2020-03-15 18:31:38机械原因是由于机械原因导致的数据收集或保存的失败造成的数据缺失,比如数据存储的失败,存储器损坏,机械故障导致某段时间数据未能收集(对于定时数据采集而言)。人为原因是由于人的主观失误、历史局限或有意隐瞒... -
最强数据集集合:50个最佳机器学习公共数据集
2018-11-08 09:13:57最强数据集集合:50个最佳机器学习公共数据集 https://mp.weixin.qq.com/s/_A71fTgwSyaW5XTAySIGOA 原作 mlmemoirs 郭一璞 编译 量子位 报道 | 公众号 QbitAI 外国自媒体mlmemoirs根据github、福布斯、... -
案例上手 Python 数据可视化
2019-02-27 23:30:05课程亮点 ...数据可视化是数据分析和机器学习的重要环节,比如数据清洗、特征工程、机器学习、数据分析(特别是报告)、评估等环节都会用到“数据可视化”技术。 数据可视化同时还广泛存在于各... -
大数据处理的基本流程:数据抽取与集成+数据分析+数据解释
2019-12-16 12:16:402007 年 1 月,图灵奖得主、关系型数据库鼻祖 JimGray 发表演讲,他凭着自己对于人类科学发展特征的深刻洞察,敏锐地指出科学的发展正在进入“数据密集型科学发现范式”——科学史上的“第四范式... -
数据结构知识整理
2018-07-30 18:50:471.数据结构:是一门研究非数值计算的程序设计问题中计算机的操作对象以及他们之间的关系和操作等的学科。 2.数据结构涵盖的内容: 3.基本概念和术语: 数据:对客观事物的符号表示,在计算机科学中是指所有能... -
js递归方式遍历寻找树形结构数据中的节点。
2020-02-03 23:45:03最近突然兴起了解树形结构数据,所以一时兴起想了下要如果去实现在树状结构数据中遍历寻找想要的节点。 实现思路就是通过递归函数判断当前节点是否等于要找的节点id,如果不是再判断是否有children节点,再通过递归... -
Excel函数IF的多条件通配使用方法
2020-08-13 15:30:15Excel函数IF的多条件通配使用方法 在Excel中,IF函数是一个常用的条件判断函数,比如最常见的举例:成绩表。 首先我们先确定,IF函数的格式。 函数 表达式 IF =IF(A1,[如果条件成立返回内容],[如果条件不... -
数据挖掘的技术有很多种,按照不同的分类有不同的分类法
2019-03-30 13:38:34数据挖掘的任务是从数据集中发现模式,可以发现的模式有很多种,按功能可以分为两大类:预测性(Predictive)模式和描述性(Descriptive)模式。在应用中往往根据模式的实际作用细分为以下几种:分类,估值,预测,... -
DataTable中查询符合条件的数据
2012-03-22 13:59:23Dim rows As DataRow() = datatable.Select("客户='" & custom & "' and 持卡人身份证号码='" & taskrow("持卡人身份证号码").ToString & "'") s= rows(0)(1).ToString -
Matlab查找数据之find函数
2020-11-28 21:30:01k = find(X,4,'last') 输出结果如下图: 3.5 [row,col] = find(X>0 & X,3) 查找满足多个条件的元素 %% 满足多个条件的元素 % 在4×4矩阵中找到大于| 0 |的前三个元素。 并且小于| 10 |。 指定两个输出以将行和列... -
JavaScript查找一个数组中符合某个条件的值,并将符合条件的值存入新的数组
2020-07-06 13:53:121. 利用find函数和es6箭头函数,下面方法取到数组中满足条件的第一个元素; var newArray = {};//新对象 var array = [ {name:'aiai',age:18}, {name:'sisi',age:18}, {name:'lulu',age:18}, {name:'sisi',age:... -
C++数据结构——链表
2018-06-27 22:03:59C++数据结构——链表参考博客:(1)实践:https://www.cnblogs.com/renyuan/archive/2013/05/21/3091524.html(2)实践:https://blog.csdn.net/lg1259156776/article/details/47021505(3)理论:数据结构(二)... -
数据结构C语言严蔚敏版(第二版)超详细笔记附带课后习题
2020-11-07 11:38:30根据此书所做随笔笔记。 一、绪论 1.1、数据机构的研究内容 ...由于数据必须在计算机中处理,因此不能局限于数据本身的数学问题的研究,还必须考虑数据的物理结构,即数据在计算机中的存储结构。 1. -
交通流预测爬坑记(一):交通流数据集,原始数据
2021-04-21 10:52:34常用的交通流数据集,持续更新~~ -
机器学习和数据挖掘
2020-10-27 21:08:00数据分析,或者说数据挖掘,目的是从大数据中寻找到有趣模式和知识。 数据挖掘,使用到了多种技术,包括统计学,模式识别,可视化,机器学习等等。今天我们来探究一下在数据挖掘领域,有哪些算法可以使用。 女士... -
自动驾驶算法学习:多传感器信息融合(标定, 数据融合, 任务融合)
2019-08-23 14:33:58良好的相机到相机标定结果,中间部分为融合结果,重叠较好: 错误的相机到相机标定结果,,中间部分为融合结果,有绿色重影: 2.2 相机到多线激光雷达标定 基本方法:在产生的点云投影图像内,可寻找其中具有明显... -
数据挖掘:数据清洗——缺失值处理
2020-02-17 16:15:02数据挖掘:数据预处理——缺失值处理 一、什么是缺失值 缺失值是指粗糙数据中由于缺少信息而造成的数据的聚类、分组、删失或截断。它指的是现有数据集中某个或某些属性的值是不完全的。 而在数据处理的过程中,缺失... -
数据挖掘——常用聚类算法总结
2019-06-04 15:50:39数据挖掘常又被称为价值发现或者是数据勘探,一般是指从大量的、不完全的、有噪声的、模糊的、随机的实际应用数据中,提取隐含在其中的,人们事先不知道的、但又是潜在有用的信息和知识的过程。它是一种大量数据的...