一、排序算法和递归

1、算法之冒泡排序

冒泡排序原理

ary = [8, 2, 1, 5]
需求:升序
第一轮:[2, 1, 5, 8] 经过第一轮比较,得到了第一个最大数8
第二轮:[2, 1, 5, 8] 经过第二轮比较,得到了第二个最大数5
第三轮:[1, 2, 5, 8] 经过第三轮比较,得到了第三个最大数2

轮数的规律:ary.length-1
两两比较规律:ary.length-1-已经必过的轮数

  1. // 冒泡排序
  2. var ary = [3, 2, 5, 7, 8, 1];
  3. function fn(ary) {
  4. // 轮数
  5. for (i=0;i<ary.length-1;i++) {
  6. // 两两进行比较
  7. for (j=0;j<ary.length-1-i;j++) {
  8. // 当前项比下一项大,就换位置
  9. if(ary[j]>ary[j+1]) {
  10. // 定义一个新变量临时存储一个值,方便交换两个数值
  11. var temp = ary[j];
  12. ary[j] = ary[j+1];
  13. ary[j+1] = temp;
  14. }
  15. }
  16. }
  17. return ary;
  18. }
  19. var res = fn(ary);
  20. console.log(res);

2、算法之快速排序

快速排序的原理

快速排序原理.png

  1. // 快速排序
  2. var ary2 = [11, 12, 52, 33, 77, 88, 99, 18];
  3. function quickSort(ary) {
  4. // 如果传入的原数组、左边数组、右边数组长度小于1,就不用分左右数组了
  5. if (ary.length <= 1) {
  6. return ary;
  7. }
  8. // 中间项的索引(注意:索引需要向下取整)
  9. var centerIndex = Math.floor(ary.length/2);
  10. // ary.splice() 返回值是一个数组!!!
  11. // 删除中间项并且获取中间项!!
  12. // var centerValue = ary[centerIndex]; 只能获取到中间项
  13. var centerValue = ary.splice(centerIndex,1)[0];
  14. // 定义左右空数组
  15. var leftAry = [], rightAry = [];
  16. for (i=0;i<ary.length;i++) {
  17. // 小于中间项,push到左数组;大于中间项,push到右数组
  18. if (ary[i]<centerValue) {
  19. leftAry.push(ary[i]);
  20. }else {
  21. rightAry.push(ary[i]);
  22. }
  23. }
  24. // 自己调用自己就是递归;
  25. // 递归每个左右数组
  26. return quickSort(leftAry).concat(centerValue,quickSort(rightAry));
  27. }
  28. var res2 = quickSort(ary2);
  29. console.log(res2);

3、递归

自己调用自己就是递归
递归.png

  1. // 打印1到10
  2. function fn(num) {
  3. if (num>10) {
  4. return;
  5. }
  6. console.log(num);
  7. fn(num+1);
  8. }
  9. console.log(fn(1));
  10. // for循环1加到100
  11. function sum() {
  12. var res = 0;
  13. for (i=0;i<=100;i++) {
  14. res+=i;
  15. }
  16. return res;
  17. }
  18. var res3 = sum();
  19. console.log(res3);
  20. // 递归求和
  21. function total(num) {
  22. if (num>100) {
  23. return 0;
  24. }
  25. return num += total(num+1);
  26. }
  27. var res4 = total(1);
  28. console.log(res4);
  29. // 求1到100中同时能被2整除又能被3整除的所有数之和
  30. function sum2(num) {
  31. if (num>100) {
  32. // return 指令一个是返回一个指定数据给主调函数,
  33. // 另外的一个作用就是 结束 所在函数的执行
  34. return 0;
  35. }
  36. if (num%2==0 && num%3==0){
  37. return num + sum2(num+1);
  38. }
  39. return sum2(num+1);
  40. }
  41. var res5 = sum2(1);
  42. console.log(res5);
  43. // for循环实现累加
  44. function sum3() {
  45. var total = 0;
  46. for (i=1;i<=100;i++) {
  47. if (i%2==0 && i%3==0) {
  48. total += i;
  49. }
  50. }
  51. return total;
  52. }
  53. var res6 = sum3();
  54. console.log(res6);

二、字符串的常用方法

1、charAt

  • 作用:获取指定索引位置的那个字符串
  • str[索引] 和 str.charAt(索引) 基本一样;区别在于:
    • 如果超出了字符串中的长度,获取结果的不同:
      • str[索引] 得到的是undefined
      • str.charAt(索引) 得到的是””
  1. var sty="123";
  2. undefined
  3. sty[0];
  4. "1"
  5. sty[100];
  6. undefined
  7. sty.charAt(100);
  8. ""

2、charCodeAt

  • 作用:获取字符串中特定索引对应字符的ASCII值(十进制)
  1. var str = "1233";
  2. undefined
  3. str.charCodeAt(1);
  4. 50

3、indexOf/lastIndexOf

  • 作用:检索某个字符在字符串中首次/最后一次出现的索引位置
  1. var str = "1233";
  2. undefined
  3. str.charCodeAt(1);
  4. 50
  5. str.indexOf(2);
  6. 1
  7. str.lastIndexOf(3);
  8. 3

4、slice

  • 作用:slice(n, m) 从索引n开始复制到索引m位置(不包含m项)的字符串
  • 参数:可以是负数
  1. var str = "1233";
  2. undefined
  3. str.slice(1, 3);
  4. "23"

slice()和substring()的区别:slice()参数可以为负数,substring()的参数不可以为负数

  1. var str = "1233";
  2. undefined
  3. str.substring(-3,-1);
  4. ""
  5. str.substring(1,3);
  6. "23"
  7. str.slice(1,3);
  8. "23"
  9. str.slice(-3,-1);
  10. "23"

5、substring

  • 作用:同slice(n, m)
  • 参数:不可以是负数

6、substr(n, m)

  • 作用:从索引n开始截取m个
  • 参数:
    • n: 从索引n开始截取字符串
    • m: 截取m个
  1. var str = "1233";
  2. undefined
  3. str.substring(1, 3)
  4. "23"
  5. str.substr(1, 3);
  6. "233"

7、toUpperCase() / toLowerCase()

  • 作用:字符串的大小写转化
  • 参数:无参数
  1. str="12345zhu";
  2. "12345zhu"
  3. str.toUpperCase();
  4. "12345ZHU"
  5. str.toLowerCase();
  6. "12345zhu"

8、replace(n, m)

  • 作用:把字符串中的某些字符替换成别的字符
  • 参数:str.replace(n, m)
    • n: 要替换的字符 ,还可以是正则表达式
    • m: 要替换成的字符
  1. str="12345zhu666zhu";
  2. "12345zhu666zhu"
  3. str.replace("zhu", "猪");
  4. "12345猪666zhu"
  5. str.replace("zhu", "猪").replace("zhu", "pig");
  6. "12345猪666pig"
  7. str.replace(/zhu/g, "猪");
  8. "12345猪666猪"

9、split() 把字符串转成数组

  • 作用:把 字符串按照指定的分隔符,分成数组
  • 参数:分隔符
  1. var str = "10:20:30";
  2. undefined
  3. str.split(":");
  4. (3) ["10", "20", "30"]
  5. var str = "102030";
  6. undefined
  7. str.split("");
  8. (6) ["1", "0", "2", "0", "3", "0"]
  9. str.split(" ");
  10. ["102030"]

三、字符串的思考题

1、”2019-8-18 12:32:18”; ==>”2019年08月18日 12时32分18秒”

  1. // "2019-8-18 12:32:18"; ==>"2019年08月18日 12时32分18秒"
  2. function zero(num) {
  3. // num小于10的时候給前边加个0
  4. return num<10?"0"+num:num;
  5. }
  6. var str = "2019-8-18 12:32:18";
  7. var strs = str.split(" ");
  8. var str1 = strs[0].split("-");
  9. var str2 = strs[1].split(":");
  10. var time = str1[0].concat("年", str1[1], "月", str1[2], "日", " ", str2[0], "时", str2[1], "分", str2[2], "秒");
  11. var time2 = zero(str1[0]) + "年" + zero(str1[1]) + "月" + zero(str1[2]) + "日" + " " + zero(str2[0]) + "时" + zero(str2[1]) + "分" + zero(str2[2]) + "秒";
  12. console.log(time);
  13. console.log(time2);

2、str =”https://www.baidu.com?name=zhufeng&age=10&id=14“; ==> { name: ‘zhufeng’, age: ‘10’, id: ‘14’ }

  1. // str ="https://www.baidu.com?name=zhufeng&age=10&id=14"; ==> { name: 'zhufeng', age: '10', id: '14' }
  2. var str ="https://www.baidu.com?name=zhufeng&age=10&id=14";
  3. function getParms(str) {
  4. var obj = {};
  5. var strs = str.split("?")[1].split("&");
  6. for (i=0;i<strs.length;i++) {
  7. var item = strs[i];
  8. var key = item.split("=");
  9. obj[key[0]] = key[1];
  10. }
  11. return obj;
  12. }
  13. var res = getParms(str);
  14. console.log(res);