深入数组扩展应用

一、字符串反转

例如:‘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 = -1
    for (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 = -1
    var start = 0
    var end = arr.length - 1
    while (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   ==>  false

            for (var i = 0; i <= arr.length; i++) {
                if (arr[i] > arr[i - 1]) {
                  //这个条件成立说明这个序列还在增长
                    addNum++
                } else {
                  //走到这里说明序列已经断了
                    len = addNum > len ? addNum : len
                    addNum = 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue保姆级教程----深入了解Vuex的工作原理

&#x1f4e2; 鸿蒙专栏&#xff1a;想学鸿蒙的&#xff0c;冲 &#x1f4e2; C语言专栏&#xff1a;想学C语言的&#xff0c;冲 &#x1f4e2; VUE专栏&#xff1a;想学VUE的&#xff0c;冲这里 &#x1f4e2; CSS专栏&#xff1a;想学CSS的&#xff0c;冲这里 &#x1f4…

从有向带权图判断最短路径里各目标顶点顺序

对如下有向带权图&#xff0c;若采用迪杰斯特拉(Dijkstra)算法求从源点a到其他各顶点的最短路径&#xff0c;则得到的第一路径的目标顶点是b&#xff0c;第二条最短路径的目标顶点是c&#xff0c;后续得到的其余各最短路径的目标顶点依次是() A.d,e,f B.e,d,f C.f,d,e D.f,…

通过IP地址进行网络安全防护

随着互联网的普及&#xff0c;网络安全问题日益凸显。一个重要的网络安全防护手段是通过IP地址进行控制和管理。本文将介绍如何通过IP进行网络安全防护。 一、IP地址的基本概念 IP地址是互联网协议地址的简称&#xff0c;用于标识网络中的设备。IP地址由32位二进制数字组成&am…

odoo 客制化审批流

以BPM、OA为代表的应用平台&#xff0c;低代码处理为前提的审批流功能定制化 功能介绍&#xff1a; 业务对象&#xff1a;针对侵入式注册BPM业务场景&#xff1a;设置审批场景&#xff1a;如&#xff1a;请假大于三天的场景、金额大于1000的场景节点条件&#xff1a; 当符合某…

运动蓝牙耳机哪个品牌好?2024年热销运动蓝牙耳机推荐

​作为一个热爱跑步的运动爱好者&#xff0c;我在过去四年里尝试了许多不同类型的运动蓝牙耳机&#xff0c;包括入耳式、半入耳式、颈挂式和开放式等。在这个过程中&#xff0c;我逐渐总结出了挑选运动耳机的一些心得&#xff0c;了解到一款优秀的运动耳机需要满足哪些基本条件…

网络故障排查和流量分析利器-Tcpdump命令

Tcpdump是一个在Unix/Linux系统上广泛使用的命令行网络抓包工具。它能够捕获经过网络接口的数据包&#xff0c;并将其以可读的格式输出到终端或文件中。Tcpdump是一个强大的命令行工具&#xff0c;能够捕获和分析网络数据包&#xff0c;为网络管理员和安全专业人员提供了深入了…

【hyperledger-fabric】将智能合约部署到通道

简介 本文主要来自于B站视频教学视频&#xff0c;也主要参看了官方文档中下图这一章节。针对自己开发的代码做出相应的总结。 1.启动网络 # 跳转到指定的目录 cd /root/fabric/fabric-samples/test-network# 启动docker容器并且创建通道 ./network.sh up createChannel2.打…

拆分文本文件,TXT文本拆分器

在数字化飞速发展的时代&#xff0c;我们经常碰到需要处理大容量TXT文件的情况。这些文件可能包含大量的数据、日志信息或是其他重要内容。然而&#xff0c;传统的文本编辑器在处理这些庞然大物时往往会显得力不从心&#xff0c;这个时候&#xff0c;【首助编辑高手】的出现恰如…

STM32存储左右互搏 SPI总线读写FRAM MB85RS2M

STM32存储左右互搏 SPI总线读写FRAM MB85RS2M 在中低容量存储领域&#xff0c;除了FLASH的使用&#xff0c;&#xff0c;还有铁电存储器FRAM的使用&#xff0c;相对于FLASH&#xff0c;FRAM写操作时不需要预擦除&#xff0c;所以执行写操作时可以达到更高的速度&#xff0c;其…

Docker就应该这么学-01

第一章 容器与开发语言 1.1 Docker 最近一段时间&#xff0c;云计算领域最火的莫过于“容器”一词。提到容器&#xff0c;就不得不提 Docker,可以说 Docker 己经成为了容器的代名词。那么&#xff0c;什么是 Docker ? Docker 又能做什么呢&#xff1f;本章 我们就来简单介绍…

【MPC学习笔记】01:MPC简介(Lecture 1_1 Unconstrained MPC)

本笔记来自北航诸兵老师的课程 课程地址&#xff1a;模型预测控制&#xff08;2022春&#xff09;lecture 1-1 Unconstrained MPC 文章目录 0 MPC 简介0.1 案例引入0.2 系统模型0.3 MPC的优点0.4 MPC的缺点0.5 MPC的未来 1 详细介绍 0 MPC 简介 0.1 案例引入 MPC&#xff08;…

关于简单的数据可视化

1. 安装数据可视化必要的openpyxl、pandas&#xff0c;matplotlib等软件包 使用清华源&#xff0c;命令如下&#xff1a; pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --trusted-host pypi.tuna.tsinghua.edu.cn pandaspip install -i https://pypi.tuna.tsingh…

CSU计算机学院2021年C语言期末题目思路分享(后两道题)

文章目录 E: 实数相加——大数加法的拓展原题题目描述输入输出样例输入样例输出 题目思路实现步骤代码和注释 F: 谍影寻踪——链表的思想和运用原题题目描述输入输出样例输入样例输出 题目思路 一点感想 E: 实数相加——大数加法的拓展 原题 题目描述 C语言就要期末考试了&a…

com.gexin.platform 依赖下载问题

打包时报错显示&#xff1a; com.gexin.platform:gexin-rp-sdk-http:pom:4.1.1.4 failed to transfer from http://0.0.0.0/ 解决办法&#xff1a; 1、在idea中找到maven中的设置的settings.xml 2、根据路径找到settings.xml文件&#xff0c;添加以下内容 <mirror><…

2023春季李宏毅机器学习笔记 01 :正确认识 ChatGPT

资料 课程主页&#xff1a;https://speech.ee.ntu.edu.tw/~hylee/ml/2023-spring.phpGithub&#xff1a;https://github.com/Fafa-DL/Lhy_Machine_LearningB站课程&#xff1a;https://space.bilibili.com/253734135/channel/collectiondetail?sid2014800 一、对Chatgpt的误解…

『华为云耀云服务器实战』|云服务器如何快速搭建个人博客(图文详解)

文章目录 引言一、云耀云服务器L实例介绍1.1 准备一个华为云耀云服务器1.2 重置实例密码1.3 利用xshell 远程连接 二、安装环境软件2.1 安装git准备远程拉取2.2 安装Docker 和 Docker compose 三、博客开源项目介绍3.1 操作界面展览 四、拉取项目搭建个人博客4.1 拉取项目进行配…

【算法】一维、二维前缀和 解决算法题(C++)

文章目录 1. 前缀和算法 介绍2. 一维前缀和 模板引入DP34【模板】前缀和 3. 利用一维前缀和 解题724.寻找数组的中心下标238.除自身以外数组的乘积560.和为K的子数组974.和可被K整除的子数组525.连续数组 二维前缀和 模板1314.矩阵区域和 1. 前缀和算法 介绍 前缀和算法 用于高…

白话机器学习的数学-3-评估

1、 模型评估 那我们如何测量预测函数 fθ(x)的正确性&#xff0c;也就是精度呢&#xff1f; 观察函数的图形&#xff0c;看它能否很好地拟合训练数据&#xff1a; 这是只有一个变量的简单问题&#xff0c;所以才能在图上展 示出来。 过像多重回归这样的问题&#xff0c;变量增…

x-cmd pkg | bit - 实验性的现代化 git CLI

目录 简介首次用户功能特点竞品和相关作品进一步探索 简介 bit&#xff0c;由 Chris Walz 于 2020 年使用 Go 语言开发&#xff0c;提供直观的命令行补全提示和建立在 git 命令之上的封装命令&#xff0c;旨在建立完全兼容 git 命令的现代化 CLI。 首次用户 使用 x bit 即可自…

【华为机试】2023年真题B卷(python)-矩阵元素的边界值

一、题目 题目描述&#xff1a; 给定一个N*M矩阵&#xff0c;请先找出M个该矩阵中每列元素的最大值&#xff0c;然后输出这M个值中的最小值。 补充说明: N和M的取值范围均为: [0,100] 二、示例 示例1&#xff1a; 输入: [[1,2],[3,4]] 输出: 3 说明: 第一列元素为: 1和3&…