深入数组扩展应用

一、字符串反转

例如:‘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.hqwc.cn/news/316988.html

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

相关文章

【通关喜报】腾讯云TDSQL TCP/TCE、云运维tcp 12月认证考试,全员过关,年终冲刺!

2023年12月23日云贝教育有6位学员参加了腾讯云TDSQL-TCP以及TCE认证考试。都取得非常好的成绩~下面我们来看一下各位同学的理论考试和上机考试成绩吧~

我用 Python 自动生成图文并茂的数据分析报告

reportlab是Python的一个标准库&#xff0c;可以画图、画表格、编辑文字&#xff0c;最后可以输出PDF格式。它的逻辑和编辑一个word文档或者PPT很像。有两种方法&#xff1a; 1&#xff09;建立一个空白文档&#xff0c;然后在上面写文字、画图等&#xff1b; 2&#xff09;建…

【银行测试】超细支付功能测试+测试点总结分析(详全)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、支付功能怎么测…

新能源汽车@2023/24:卷价格、拼智能与生态战

【潮汐商业评论/原创】 2023年末尾&#xff0c;受到大众广泛热议的小米汽车发布会“姗姗来迟”&#xff0c;也为“乱战”中的2023新能源汽车市场画上了一个句号。 然而&#xff0c;在雷军整整三个小时看似平和的演讲与技术讲解中&#xff0c;实则在电机、智驾、智舱等核心技术…

vue3按钮点击频率控制

现有一个按钮&#xff0c;如下图 点击时 再次点击 刷新窗口再次点击 刷新窗口依然可以实现点击频率控制。 代码实现&#xff1a; <template><!--<el-config-provider :locale"locale"><router-view/></el-config-provider>--><el…

BERT(从理论到实践): Bidirectional Encoder Representations from Transformers【1】

预训练模型:A pre-trained model is a saved network that was previously trained on a large dataset, typically on a large-scale image-classification task. You either use the pretrained model as is or use transfer learning to customize this model to a given t…

深度生成模型之图像翻译GAN ->(个人学习记录笔记)

文章目录 深度生成模型之图像翻译GAN图像翻译的应用1. 风格迁移2. 数据增强3. 经典图像任务4. 内容创作5. 人脸图像编辑6. 人体图像编辑 图像翻译模型1. 有监督图像翻译模型2. 无监督图像翻译模型3. 多域图像翻译模型 深度生成模型之图像翻译GAN 图像翻译的应用 1. 风格迁移 …

基于PCA-WA(Principal Component Analysis-weight average)的图像融合方法 Matlab代码及示例

摘要&#xff1a; 高效地将多通道的图像数据压缩&#xff08;如高光谱、多光谱成像数据&#xff09;至较低的通道数&#xff0c;对提高深度学习&#xff08;DL&#xff09;模型的训练速度和预测至关重要。本文主要展示利用PCA降维结合weight-average的图像融合方法。文章主要参…

一篇文章带你搞定Python所有内置函数

前言 Python 内置了许多的函数和类型&#xff0c;比如print()&#xff0c;input()等&#xff0c;我们可以直接在程序中使用它们&#xff0c;非常方便&#xff0c;并且它们是Python解释器的底层实现的&#xff0c;所以效率是比一般的自定义函数更有效率。目前共有71个内置函数&…

VS+QT五子棋游戏开发

1、首先安装好VS软件和QT库&#xff0c;将其配置好&#xff0c;具体不在此展开说明。 2、文件结构如下图&#xff1a; 3、绘制棋盘代码&#xff0c;如下&#xff1a; void Qwzq::paintEvent(QPaintEvent* event) {QPainter painter(this);painter.setRenderHint(QPainter::An…

上门洗衣洗鞋小程序足不出户上门预约即可清洗,相较于传统线下洗鞋有哪些优势?

校园洗护小程序&#xff0c;相较于传统的线下洗鞋方式&#xff0c;有着以下显著优势&#xff1a; 1. 便捷性&#xff1a;通过手机&#xff0c;随时随地轻松下单与查询&#xff0c;免去了用户来回奔波之苦。学生们在校园内或宿舍&#xff0c;即可轻松预约洗鞋并完成取件。 2. 智…

RabbitMQ 发送消息 绕过系统配置的 消息转换器方法

1. 背景 我负责的系统需要与其他系统交互&#xff0c;需要我将消息发送到 MQ 上&#xff0c;其他系统监听消息。 遇到问题&#xff0c;两个系统的发送消息格式都是不一致的&#xff0c;所以这个地方是需要协商打通的。 目前这个系统经我查阅发现用的 fastjson 的 jsonb 序列…