深入数组扩展应用

一、字符串反转

例如:‘123abc’----->‘cba321’

字符串方法实现:

var str = '123abc'var reversFn = function(str) {var newStr = ''for (var i = str.length - 1; i >= 0; i--) {newStr += str[i]}return newStr
}console.log(reversFn(str));

数组方法实现:

var str = '123abc'var reversFn = function(str) {return str.split('').reverse().join('')
}console.log(reversFn(str));

split()

用于把一个字符串分割成字符串数组
语法:string.split(separator,limit)

image.png

reverse()

用于颠倒数组中元素的顺序。
语法:array.reverse()

join()

用于把数组中的所有元素转换一个字符串。
语法:array.join(separator)

image.png

二、在有序的数组找出指定的值,返回该值在数组中的索引

方法1:循环遍历数组

var arr = [1, 3, 5, 7, 9, 10, 11, 12, 14, 15];// 使用数组的方式进行实现
var findIndex = function(arr, item) {var index = -1for (var i = 0; i < arr.length; i++) {if (arr[i] === item)return index = i}return index
}console.log(findIndex(arr, 5));

方法2:二分查找

image.png

var findIndex = function(arr, item) {var index = -1var start = 0var end = arr.length - 1while (start <= end) {var middle = parseInt((start + end) / 2)if (item === arr[middle]) {return index = middle} else if (item < arr[middle]) {end = middle - 1} else if (item > arr[middle]) {start = middle + 1}}
}console.log(findIndex(arr, 5))

方法3:es6新增方法findIndex()

//es6实现方法
function getIndex(arr, val) {// findIndex()这个方法是Array对象身上的return arr.findIndex(function(value) {return value == val//return的值为true,就能返回该值对应的索引})
}

findIndex()

返回一个测试条件(函数)符合条件的数组第一个元素位置
为数组中每个元素都调用一次函数执行

  • 当数组中的元素在测试条件时返回true时,findIndex()返回符合条件的元素的索引位置,之后的值不会再调用执行函数
  • 如果没有符合条件的元素返回-1

语法:array.findIndex(function(currentValue, index, arr), thisValue)

image.png

三、判断数组是否对称

例如:
var arr1= [‘a’, ‘b’, ‘c’, ‘d’, ‘c’, ‘b’, ‘a’];
var arr2= [‘a’, ‘b’, ‘c’, ‘c’, ‘b’, ‘a’];

方法1:数组循环实现

var arr1 = ['a', 'b', 'c', 'b', 'a']
var arr2 = ['a', 'b', 'c', 'c', 'b', 'a']
var arr3 = ['a', 'b', 'c', 'a', 'b', 'c']var checkSymmetry = function(arr) {// 倒着把这个数组进行一下填充var newArr = []for (var i = arr.length - 1; i >= 0; i--) {newArr.push(arr[i])}for (var i = 0; i < arr.length; i++) {if (newArr[i] !== arr[i])return false}return true
}
console.log(checkSymmetry(arr3))

方法2:首位判断

function symmetry(arr) {var start = 0;var end = arr.length - 1;for (var i = 0; i < arr.length; i++) {//console.log(start,end);if (arr[start] != arr[end]) {return false;}start++;end--;}return true;
}
改进:
function symmetry(arr) {for (var i = 0; i < arr.length; i++) {if (arr[i] != arr[arr.length - 1 - i]) {return false;}}return true;
}
进一步优化
function symmetry(arr) {var start = 0;var end = arr.length - 1;while (start < end) {if (arr[start] != arr[end]) {return false;}start++;end--;}return true;
}

image.png

四、查询字符串首次出现的位置

查询字符串首次出现的位置,如原字符串:abccbaxzabc,字符串axz结果为5,最终目标,实现一个基本的string的indexOf方法

image.png
b7e6d7bdf3ba2074e8e15458c104048.png

方法1:使用slice()

var str = 'abccbaxzbc'
var sub = 'axz'var findIndex = function(str, sub) {var start = 0;//符合条件的第一个字母的索引值var end = str.length - sub.length;while (start <= end) {if (str.slice(start, sub.length + start) === sub) {return start}start++}return -1}
console.log(findIndex(str, sub));

slice()

slice(start,end):方法可从已有数组中返回选定的元素,返回一个新数组,包含从start到end(不包含该元素)的数组元素。

注意:该方法不会改变原数组,而是返回一个子数组,如果想删除数组中的一段元素,应该使用Array.splice()方法。

  • start参数:必须,规定从何处开始选取,如果为负数,规定从数组尾部算起的位置,-1是指最后一个元素。
  • end参数:可选(如果该参数没有指定,那么切分的数组包含从start倒数组结束的所有元素,如果这个参数为负数,那么规定是从数组尾部开始算起的元素)。

方法2:使用substr()

var findIndex = function(str, sub) {var index = 0;var len1 = str.length;var len2 = sub.length;while (index <= len1 - len2) {if (str.substr(index, len2) === sub) {return index}index++}return -1}console.log(findIndex(str, sub));

substr()

可在字符串中抽取从_ 开始_ 下标开始的指定数目的字符。
提示: substr() 的参数指定的是子串的开始位置和长度,因此它可以替代 substring() 和 slice() 来使用。

image.png

方法3:双重循环

var findIndex = function(str, sub) {for (var i = 0; i <= str.length - sub.length; i++) {for (var j = 0; j < sub.length; j++) {//子串的索引与原串的索引的关系为:子串的索引(j)+挪动的次数(i)=原串的索引if (sub[j] !== str[j + i]) {break}//0 1 2//这个条件是找到的条件,只能把子串里的最后一位匹配到了,才说明子串里的所有字符在原串里都找到了if (j === sub.length - 1) {return i}}}return -1}console.log(findIndex(str, sub));

五、查找最大子序列长度

在指定的数组中,查找最大的连续增长的子序列的长度,例如下面的数组查找,结果为5

image.png

方法1:

// var arr = [1, 2, 3, 4, 1, 2, 3, 4, 5, 1, 2, 3]var arr1 = [1, 2, 3, 4, 1, 2, 3, 4, 5, 1, 2, 3, 6, 7, 90, 98, 99]var getMaxLen = function(arr) {var addNum = 0;//每个序列增长的次数var len = 0//增长次数最大的那个序列的长度//console.log(arr[-1]); //undefined// 1 > undefined   ==>    1 > NaN   ==>  falsefor (var i = 0; i <= arr.length; i++) {if (arr[i] > arr[i - 1]) {//这个条件成立说明这个序列还在增长addNum++} else {//走到这里说明序列已经断了len = addNum > len ? addNum : lenaddNum = 1}}return len}console.log(getMaxLen(arr1))
  • 首先,之所以第18行要addNum=1是为了让新的升序字串 从1开始
  • 数组的【-1】是undefined,undefined隐式类型转换之后,变成NAN 1> NaN,结果为 false
  • 同样的,如果最长子串是在后面,那么如果我们for循环的条件内是i< arr.length
  • 我们的代码,并不能让最长的字符串赋值给len,所以我们让其用小于等于arr[arr.length]= undefined一样的进行转换

方法2:max()+apply()

// var arr = [1, 2, 3, 4, 1, 2, 3, 4, 5, 1, 2, 3]var arr1 = [1, 2, 3, 4, 1, 2, 3, 4, 5, 1, 2, 3, 6, 7, 90, 98, 99]var getMaxLen = function (arr) {var addNum = 0;var tempArr = [];for (var i = 0; i < arr.length; i++) {if (arr[i] < arr[i + 1]) {addNum++;} else {tempArr.push(addNum + 1)addNum = 0}}return Math.max.apply(null, tempArr)
}console.log(getMaxLen(arr1))

max()

可返回两个指定的数中带有较大的值的那个数。

image.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/593118.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Elasticsearch:如何使用 Elasticsearch 进行排序

虽然你在唱这首歌时可能会想象圣诞老人&#xff0c;但欧洲民间传说&#xff0c;尤其是阿尔卑斯地区的民间传说&#xff0c;有两个传奇人物圣尼古拉斯和坎普斯。 象征着慷慨和善良的圣尼古拉斯&#xff0c;在 12 月 6 日 为乖巧的孩子们带来礼物和欢乐&#xff01; 相比之下&…

【C语言】作用域 和 生命周期

&#x1f6a9; WRITE IN FRONT &#x1f6a9; &#x1f50e; 介绍&#xff1a;"謓泽"正在路上朝着"攻城狮"方向"前进四" &#x1f50e;&#x1f3c5; 荣誉&#xff1a;2021|2022年度博客之星物联网与嵌入式开发TOP5|TOP4、2021|2222年获评…

计算机网络--作业

作业一 1、比较电路交换、报文交换和分组报文交换优缺点 电路交换 电路交换是以电路连接为目的的交换方式&#xff0c;通信之前要在通信双方之间建立一条被双方独占的物理通道&#xff08;由通信双方之间的交换设备和链路逐段连接而成&#xff09;。 优点&#xff1a; ①由于…

实战SRC | api接口未授权 + 越权漏洞

本文由掌控安全学院 - zxl2605 投稿 一次在fofa上通过学习的fofa语句进行查询&#xff0c;无意中查询到了一个网址 其登录界面如下&#xff1a; 使用浏览器的F12打开开发者工具&#xff0c;查看JS寻找接口&#xff1a; 从JS代码中查询到一处接口如下&#xff1a; 发现是以p…

bilibili深入理解计算机系统笔记(3):使用C语言实现静态链接器

本文是2022年的项目笔记&#xff0c;2024年1月1日整理文件的时候发现之&#xff0c;还是决定发布出来。 Github链接&#xff1a;https://github.com/shizhengLi/csapp_bilibili 文章目录 可执行链接文件(ELF)ELF headerSection header符号表symtab二进制数如何和symtab结构成员…

ELK+kafka+filebeat企业内部日志分析系统搭建

看上面的拓扑图&#xff0c;我们至少准备七台机器进行下面的实验项目。 机器主要作用分布如下: 三台安装elasticsearch来搭建ES集群实现高可用&#xff0c;其他机器就依次安装filebeat,kafka,logstash和kibana软件 一、部署elasticsearch来搭建ES集群 1.安装jdk 由于ES运行…

C语言数组习题

1.数组遍历 #include <stdio.h>int main(){int i,a[10];for(i0;i<9;i) //对数组元素a[0]~a[9]赋值 a[i]i;for(i9;i>0;i--) //输出a[9]~a[0]共10个数组元素 printf("%d ",a[i]);printf("\n");return 0;} 运行结果&#xff1a; 2.数组应用&a…

atoi函数的模拟实现

这里强力推荐一篇文章 http://t.csdnimg.cn/kWuAm 详细解析了atoi函数以及其模拟实现&#xff0c;我这里就不说了。 这里作者先把自己模拟的代码给大家看一下。 int add(char* arr) {char* arr2 arr;while (*arr!-48){arr;}arr--;int sum 0;int n 0;while (arr ! (arr2-…

如何构建高效测试体系?掌握5大自动化测试模式就够了

软件开发过程中&#xff0c;高效的自动化测试体系是提升测试效率、保证产品质量关键&#xff0c;一个全面的测试体系涵盖多个维度&#xff0c;从功能性到用户界面&#xff0c;再到性能和安全性。 每个维度均采用不同的测试模式来满足特定的需求和解决特别的挑战&#xff0c;本…

快速打通 Vue 3(三):Vue3 中的 watch 监听器与新特性

很激动进入了 Vue 3 的学习&#xff0c;作为一个已经上线了三年多的框架&#xff0c;很多项目都开始使用 Vue 3 来编写了 这一组文章主要聚焦于 Vue 3 的新技术和新特性 如果想要学习基础的 Vue 语法可以看我专栏中的其他博客 Vue&#xff08;一&#xff09;&#xff1a;Vue 入…

为什么国产操作系统是基于linux研发的呢?

为什么国产操作系统是基于linux研发的呢&#xff1f; 在开始前我有一些资料&#xff0c;是我根据自己从业十年经验&#xff0c;熬夜搞了几个通宵&#xff0c;精心整理了一份「Linux的资料从专业入门到高级教程工具包」&#xff0c;点个关注&#xff0c;全部无偿共享给大家&…

2023年AIGC发展回顾与展望

2023年是人工智能内容生成&#xff08;AIGC&#xff09;技术飞速发展的一年。从年初ChatGPT一炮打响&#xff0c;大家纷纷加入到大模型研究之中。期间Midjourney和Stable Diffusion AI绘画技术持续火热&#xff0c;基于AIGC类的应用也如雨后春笋般遍地开花。万众瞩目的OpenAI G…

1.1 理解大数据(2)

小肥柴的Hadoop之旅 1.1 理解大数据&#xff08;2&#xff09; 目录1.1 理解大数据1.1.3 大数据概述1.1.4 更多思考 参考文献和资料 目录 1.1 理解大数据 1.1.3 大数据概述 step_0 大数据定义 【《大数据算法设计分析》】&#xff1a; 通常来讲大数据&#xff08;Big Data&am…

生态系统服务构建生态安全格局中的实践技术应用

生态安全是指生态系统的健康和完整情况。生态安全的内涵可以归纳为&#xff1a;一&#xff0c;保持生态系统活力和内外部组分、结构的稳定与持续性&#xff1b;二&#xff0c;维持生态系统生态功能的完整性&#xff1b;三&#xff0c;面临外来不利因素时&#xff0c;生态系统具…

解决jenkins的Exec command命令不生效,或者执行停不下来的问题

Jenkins构建完后将war包通过 Publish Over SSH 的插件发布到服务器上&#xff0c;在服务器上执行脚本时&#xff0c;脚本中的 nohup 命令无法执行&#xff0c;并不生效&#xff0c;我配置的Exec command命令是后台启动一个war包&#xff0c;并输出日志文件。 nohup java -jar /…

批量美化图片:让您的图片库焕然一新!

您是否曾经遇到过这样的问题&#xff1a;在处理大量图片时&#xff0c;一张一张地调整时间和精力成本太高&#xff1f;现在&#xff0c;我们为您带来了一款全新的批量图片美化工具&#xff0c;让您轻松解决这个问题&#xff01; 首先&#xff0c; 我们要进入首助编辑高手主页面…

/etc/profile文件一不小心改坏了,所有命令无法执行了怎么办?

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 问题描述&#xff1a; 在部署jdk的时候&#xff0c;修改/etc/profile文件&#xff0c;文件改得有问题&#xff0c;但是当时没有…

【elfboard linux开发板】5.vmware tools安装及uart属性的获取和设置

1. 安装VMware tools 系统&#xff1a;ubuntu22.04 虚拟机版本&#xff1a;VMware workstation 16 pro&#xff08;16.1.2&#xff09; VMware tools文件&#xff08;iso)一般在虚拟机目录下&#xff0c;如果没有&#xff0c;这是下载网址&#xff0c;找到对应的虚拟机版本下载…

ARM笔记-----输入捕获

输入捕获可以对输入的信号的上升沿、下降沿或者双边沿进行捕获&#xff0c;常用的有测量输入信号的脉 宽&#xff0c;和测量 PWM 输入信号的频率和占空比这两种。 输入捕获的大概的原理 当捕获到信号的跳变沿的时候&#xff0c;把计数器 CNT 的值锁存到捕获寄 存器 CCR 中…

2023机器人行业总结,2024机器人崛起元年(具身智能)

2023总结&#xff1a; 1.Chatgpt引爆了通用人工智能&#xff0c;最大的受益者或是机器人&#xff0c;2023年最热门的创业赛道便是人形机器人&#xff0c;优必选更是成为人形机器人上市第一股&#xff0c; 可以说2023年是机器人开启智能化的元年&#xff0c;而2024则将成为机器…