1.1 数组去重的五种方法

数组去重:将数组中重复的元素去掉

  • JS数组没有删除具体元素的删除(只能删掉值,删不掉元素的索引),可以使用另外一个结构来进行存储

    • 新数组

    • 新对象

  • JS数组虽然本质可以删除第一个和最后一个元素,可以利用

  • 这一特性,交换当前重复的元素到最后,然后进行删除(pop() 或者length--)

    <!DOCTYPE html>
    <html lang="en"> <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    </head> <body>
    <script>
    var arr = [20, 66, 88, 25, 66, 90, 88, 50];// [20,25,66,88,90,50] //1.排序法 : 最好理解 // //1.1 对数组排序
    // arr.sort(function(a,b){
    // return a-b;
    // });
    // console.log(arr);
    // //1.2 声明空数组存储去重后的数组
    // var newArr = [];
    // //1.3 遍历arr,检查arr[i]与arr[i+1]是否相等
    // for(var i = 0;i<arr.length;i++){
    // if(arr[i] != arr[i+1]){
    // newArr[newArr.length] = arr[i];
    // };
    // };
    // console.log(newArr); //2.开关思想(假设成立法) // //2.1 声明空数组存储去重后的数组
    // var newArr = [];
    // //2.2 遍历arr,检查arr[i]在不在newArr中
    // for (var i = 0; i < arr.length; i++) {
    // //开关思想 : 某种操作结果只有两种清空。布尔类型存储两种情况。
    // //1.声明开关
    // var single = true;//假设不在
    // //2.遍历newArr检查 只要与arr[i]相等
    // for(var j = 0;j<newArr.length;j++){
    // if(arr[i] == newArr[j]){
    // single = false;
    // break;//只要发现重复元素,后面没有必要比较
    // };
    // };
    // //3. 根据开关结果实现需求
    // if(single){
    // newArr[newArr.length] = arr[i];
    // };
    // }; // console.log(newArr); //3.indexOf : 常用 // //2.1 声明空数组存储去重后的数组
    // var newArr = [];
    // //2.2 遍历arr,检查arr[i]在不在newArr中
    // for (var i = 0; i < arr.length; i++) {
    // if(newArr.indexOf(arr[i]) == -1){//不在
    // newArr.push(arr[i]);
    // }
    // }; // console.log(newArr); //4.对象法 var arr = [20, 66, 88, 25, 66, 90, 88, 50]; /* 核心思路:利用对象的属性名不能重复
    对象的取值赋值特点
    取值 : 存在,取值。 不存在,取undefined
    赋值 : 存在,修改。 不存在,动态添加 1.声明空对象 : 检查数组元素是否重复 (元素作为属性名,检查对象有没有这个属性)
    2.声明空数组 :存储去重后的数组
    3.遍历arr,检查arr[i]是否重复
    */
    var obj = {};
    var newArr = [];
    for(var i = 0;i<arr.length;i++){
    //检查对象有没有 arr[i] 这个属性?
    if(obj[arr[i]] == undefined){//未重复
    newArr.push(arr[i]);
    obj[arr[i]] = 1;//这里赋值目的是为了下一次取值,不是undefined
    }
    }; console.log(newArr); //5.重复元素自我交换删除法
    /*
    核心思路:判定元素在数组中查到的位置是否是自身(元素是一定能找到的)
    * 如果是自身:说明当前元素还没有重复
    * 如果不是自身:说明当前元素在前面已经存在过:交换最后一个元素,然后把最后一个删除 步骤:
    1.遍历数组的每一个元素
    2.判定当前遍历的元素在当前数组中存在的位置,判定位置是否是当当前自己的位置
    2.1.是自己位置,说明前面没有重复,忽略
    2.2.不是自己位置,说明前面已经存在:
    2.2.1交换最后一个元素过来
    2.2.2然后删除
    2.2.3最后一个元素有可能已经与前面重复了,为了不跳过当前新交换的元素,重新从当前元素开始检索
    */
    arr = [1,1,2,3,5,0,1];
    for (var i = 0; i < arr.length; i++) {
    //判定当前元素在数组中找出的位置
    if (arr.indexOf(arr[i]) != i) {
    //说明不是自己:前面已经存在过
    //交换最后一个元素过来(因为最后一个可以删除
    var temp = arr[i];
    arr[i] = arr[arr.length - 1];
    arr[arr.length - 1] = temp; //删除最后一个元素:两种方式都可以
    // arr.pop();
    arr.length--; //最后一个元素有可能已经与前面重复了,所以为了保证安全,被交换过来的元素还要重新经受考验
    i--;
    }
    } //注意:以上方式会改变数组中原来元素的顺序位置 </script>
    </body> </html>

    1.2-循环嵌套练习:九九乘法表

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    </head>
    <body>
    <script>
    /*
    第一行 i= 1 ,列数 1
    第二行 i= 2 ,列数 2
    第三行 i= 3 ,列数 3
    ^^^
    i = 9 ,列数 9 内层循环次数 = i
    */ //1.外层循环 : 行 9
    for(let i = 1;i<=9;i++){
    //2.内层循环次数 = i
    for(let j = 1;j<=i;j++){// i = 9 j = 1 2 3 4 5 6 7 8 9
    document.write(j + '*' + i + '=' + j*i + '&nbsp;&nbsp;');
    };
    document.write('<br><br>');
    }; </script>
    </body>
    </html>
  • 1.3-数组排序-冒泡算法

算法algorithm,是一种解决问题的方法

算法的目标:使用最少的内存,最短的时间,解决最多的问题

冒泡算法:

重复地走访过要排序的元素列,依次比较两个相邻的元素

顺序正确:代表位置正确,不需要交换

顺序错误:交换两个元素,让顺序正确

<script>
/*
冒泡算法(顺序:从小到大)
1.从第一个元素开始,比较下一个元素
* 如果前面一个大于后面的元素:交换
* 如果前面一个小于或者等于后面的元素:不用动
2.循环比较数组中的每一个元素:直到最大的那个元素到达数组最后 3.一次循环,只能得出最大的数据排到最后,因此需要根据数组元素的长度来进行循环嵌套
* 一次只能让当前最大的到最后(如果原来最大的就在最后,那么就是次大的)
* 根据数组长度实现:每次都能得出一个最大,直到全部都排好序
*/ // 定义一个无序数组
let arr = [3,5,1,8,6,2]; // 外部循环:决定里面循环的次数
for(let i = 0;i < arr.length;i++){
// 内部循环:决定当前最大的元素跑到正确的位置去
for(let j = 0;j < arr.length - 1;j++){
// j < arr.length - 1 是因为需要进行向后一个进行元素匹配 // 判定当前元素与后一个元素的关系:前面大于后面:交换(其他情况不用变)
if(arr[j] > arr[j+1]){
// 交换两个元素的值:采用第三个变量
let temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
} console.log(arr); // [1,2,3,5,6,8]
</script>

JS基础算法题(二)的更多相关文章

  1. FCC JS基础算法题(5):Return Largest Numbers in Arrays(找出多个数组中的最大数)

    题目描述: 找出多个数组中的最大数右边大数组中包含了4个小数组,分别找到每个小数组中的最大值,然后把它们串联起来,形成一个新数组.提示:你可以用for循环来迭代数组,并通过arr[i]的方式来访问数组 ...

  2. FCC JS基础算法题(4):Title Case a Sentence(句中单词首字母大写)

    题目描述: 确保字符串的每个单词首字母都大写,其余部分小写.像'the'和'of'这样的连接符同理. 算法: function titleCase(str) { // 转小写及分割成数组 var st ...

  3. FCC JS基础算法题(2):Check for Palindromes(检查回文字符串)

    题目描述: 如果给定的字符串是回文,返回true,反之,返回false.如果一个字符串忽略标点符号.大小写和空格,正着读和反着读一模一样,那么这个字符串就是palindrome(回文).注意你需要去掉 ...

  4. FCC JS基础算法题(1):Factorialize a Number(计算一个整数的阶乘)

    题目描述: 如果用字母n来代表一个整数,阶乘代表着所有小于或等于n的整数的乘积.阶乘通常简写成 n!例如: 5! = 1 * 2 * 3 * 4 * 5 = 120. 算法: function fac ...

  5. FCC JS基础算法题(0):Reverse a String(翻转字符串)

    题目描述: 先把字符串转化成数组,再借助数组的reverse方法翻转数组顺序,最后把数组转化成字符串.你的结果必须得是一个字符串. 算法: function reverseString(str) { ...

  6. FCC JS基础算法题(10):Falsy Bouncer(过滤数组假值)

    题目描述: 删除数组中的所有假值.在JavaScript中,假值有false.null.0."".undefined 和 NaN. 使用filter方法,过滤掉生成的 Boolea ...

  7. FCC JS基础算法题(3):Find the Longest Word in a String (找出最长单词)

    题目描述: 在句子中找出最长的单词,并返回它的长度.函数的返回值应该是一个数字. 基本思路,将字符串转换成数组,然后得出数组中单个元素的长度,对长度进行排序,返回最大的一个 代码: function ...

  8. FCC JS基础算法题(13):Caesars Cipher(凯撒密码)

    题目描述: 下面我们来介绍风靡全球的凯撒密码Caesar cipher,又叫移位密码.移位密码也就是密码中的字母会按照指定的数量来做移位.一个常见的案例就是ROT13密码,字母会移位13个位置.由'A ...

  9. FCC JS基础算法题(12):Where do I belong(数组排序并找出元素索引)

    题目描述: 先给数组排序,然后找到指定的值在数组的位置,最后返回位置对应的索引.举例:where([1,2,3,4], 1.5) 应该返回 1.因为1.5插入到数组[1,2,3,4]后变成[1,1.5 ...

随机推荐

  1. .NET 云原生架构师训练营(模块一 架构师与云原生)--学习笔记

    目录 什么是软件架构 软件架构的基本思路 单体向分布式演进.云原生.技术中台 1.1 什么是软件架构 1.1.1 什么是架构? Software architecture = {Elements, F ...

  2. javaagent+asm破解censum

    内容介绍 最近在学习字节码相关知识,了解到通过ASM字节码改写技术来做破解一些软件破解,非常感兴趣,本文记录一下破解 Censum的过程(仅个人学习使用). 之前也写过一篇暴力破解Censum的文章, ...

  3. Go | Go 使用 consul 做服务发现

    Go 使用 consul 做服务发现 目录 Go 使用 consul 做服务发现 前言 一.目标 二.使用步骤 1. 安装 consul 2. 服务注册 定义接口 具体实现 测试用例 3. 服务发现 ...

  4. 2016年 实验三 B2C模拟实验

    实验三 B2C模拟实验 [实验目的] 掌握网上购物的基本流程和B2C平台的运营 [实验条件] ⑴.个人计算机一台 ⑵.计算机通过局域网形式接入互联网. (3).奥派电子商务应用软件 [知识准备] 本实 ...

  5. (数据科学学习手札97)掌握pandas中的transform

    本文示例文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 开门见山,在pandas中,transform是 ...

  6. MeteoInfoLab脚本示例:图形版面、点标注

    在MeteoInfoLab界面中,图形的大小会随着它所在的窗口的大小改变而改变,在需要精确控制图中一些要素的位置的时候会比较困难,这时可以用figure函数的一些参数来控制图形版面大小.figure函 ...

  7. 【C语言高级编程】你见过长度为0的数组吗?管你信不信,看就完了!

    一.什么是零长度数组 零长度数组就是长度为0的数组. ANSI C 标准规定:定义一个数组时,数组的长度必须是一个常数,即数组的长度在编译的时候是确定的.在ANSI C 中定义一个数组的方法如下: 类 ...

  8. java流程控制之习题

     经过近段时间的学习,差不多也掌握了java的流程控制以及基本知识,下面就来一起练练习题吧,看能做出来几道. 第一道题:假设小明有100块钱,这时候小明去超市需要换零钱,超市提供的零钱有1元面值,2元 ...

  9. 如何使用 Gin 和 Gorm 搭建一个简单的 API 服务 (一)

    介绍   Go 语言最近十分火热,但对于新手来说,想立马上手全新的语法和各种各样的框架还是有点难度的.即使是基础学习也很有挺有挑战性.   在这篇文章中,我想用最少的代码写出一个可用的 API 服务. ...

  10. linux(centos8):安装java jdk 14 (java 14.0.2)

    一,下载jdk14 官方网站: https://www.oracle.com/java/ 下载页面: https://www.oracle.com/cn/java/technologies/javas ...