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. 苏州6617.9373(薇)xiaojie:苏州哪里有xiaomei

    苏州哪里有小姐服务大保健[微信:6617.9373倩儿小妹[苏州叫小姐服务√o服务微信:6617.9373倩儿小妹[苏州叫小姐服务][十微信:6617.9373倩儿小妹][苏州叫小姐包夜服务][十微信 ...

  2. python实现elasticsearch操作-CRUD API

    python操作elasticsearch常用API 目录 目录 python操作elasticsearch常用API1.基础2.常见增删改操作创建更新删除3.查询操作查询拓展类实现es的CRUD操作 ...

  3. 【C/C++编程入门学习】同样是数据类型,链表对比数组?哪一个更香?

    说起链表,第一反应:链表是一种数据类型!它可以用来存储同种类型多个批量数据.   有了这种认知,很容易去联想到数组,它也是一种数据类型,也可以用来存储同种类型的批量数据.初学者往往对数组的印象比较好, ...

  4. 【差分】POJ 3263 Tallest Cow

    题目大意 POJ链接 给出\(n\)头牛的身高,和\(m\)对关系,表示牛\(a[i]\)与\(b[i]\)可以相互看见.已知最高的牛为第\(p\)头,身高为\(h\). 求每头牛的身高最大可能是多少 ...

  5. spring boot: 从配置文件中读取数据的常用方法(spring boot 2.3.4)

    一,从配置文件中读取数据有哪些方法? 通常有3种用法: 1,直接使用value注解引用得到配置项的值 2,  封装到Component类中再调用 3,  用Environment类从代码中直接访问 生 ...

  6. 第一章 数据库管理员(DBA)

    一.DBA的工作 1.初级:mysql基础安装.搭建 2.中级:数据库管理员DBA 1)用户管理 1.用户的权限2.用户可以操作的库或者表3.用户名和来源的主机4.用户的密码​grant all on ...

  7. Java9系列第7篇:Java.util.Optional优化与增强

    我计划在后续的一段时间内,写一系列关于java 9的文章,虽然java 9 不像Java 8或者Java 11那样的核心java版本,但是还是有很多的特性值得关注.期待您能关注我,我将把java 9 ...

  8. C# 获取页面Post过来的数据

    /// <summary> /// 获取post过来的数据 /// </summary> /// <param name="page">< ...

  9. 一份超全的Python学习资料汇总

    一.学习Python必备技能图谱二.0基础如何系统学习Python?一.Python的普及入门1.1 Python入门学习须知和书本配套学习建议1.2 Python简史1.3 Python的市场需求及 ...

  10. Python 从入门到精通:一个月就够了

    毫无疑问,Python 是当下最火的编程语言之一.对于许多未曾涉足计算机编程的领域「小白」来说,深入地掌握 Python 看似是一件十分困难的事.其实,只要掌握了科学的学习方法并制定了合理的学习计划, ...