做题

排序

1.在一个数组中,如果一个数是要被排序的(假如递增),那么它的左边一定有一个数比它大,或者右边有一个数比它小;题目:正反(max,min)两次遍历找到待排序区间

2.sort函数

  只对字母进行排序,只需要使用sort();数字才需要排序函数

// 排序需要提供比较函数,该函数比较两个值的大小,然后返回一个用于说明这两个值的相对顺序的数字
            // 两个参数a和b
            // 若a小于b,即a-b小于0,则返回一个小于0的值,数组升序
            // 若a大于b.数组降序
            var arr = ['12', '323', '1000', '50']
            // 升序
            function sortNum1(a, b) {
                  // 默认a-b小于0,即升序;降序可用b-a
                  return a-b
            }
            // 降序
            function sortNum2(a, b) {
                  return b-a
            }
            console.log(arr);
            console.log(arr.sort(sortNum1));
            console.log(arr.sort(sortNum2));

            // 按照数组对象中某个属性值进行排序
            var arr1 = [
                  {name:'zhangsan', age:34},
                  {name:'lisi', age:30},
                  {name:'wangwu', age:60},
            ]
            function compare(prop) {
                  return function(a, b) {
                        var value1 = a[prop]
                        var value2 = b[prop]
                        // 默认value1-value2升序
                        return value2-value1
                  }
            }
            console.log(arr1.sort(compare('age')));

   比较多元数组:

var arr = [[1,3,564],[15,2,154],[8,10,54],[2,6,879]]
            arr.sort(function(a, b) {
                  // 其中是待比较的数的索引
                  return a[2]-b[2]
            })
            console.log(arr)

 3.字符串转数组,最快

let str = "fsiuiuaiusahbusa"
console.log([...str]);

  浅拷贝:对于基础数据类型,拷贝的时候会完整地复制一份;对于引用数据类型,拷贝的是对象的引用,当原对象发生变化的时候,拷贝对象也会发生变化

  扩展运算符:用于取出参数对象中的所有可遍历属性,拷贝(浅拷贝)到当前对象中

let obj1 = { a: 1, b: 2};
let obj2 = { ...obj1, b: '2-edited'};
console.log(obj1); // {a: 1, b: 2}
console.log(obj2); //  {a: 1, b: "2-edited"}

  扩展运算符可以和解构赋值结合起来,用于生成数组(但是在这种用法下,扩展运算符只能放在参数的最后一位)

const [first, ...rest] = [1, 2, 3, 4, 5];
first // 1
rest  // [2, 3, 4, 5]

4.数组转字符串

  join():用数组的元素组成字符串,默认输出的字符串是每个数组元素用逗号分隔的形式,可以使用join('-')来使用-分隔输出元素

[...s].sort().join('')

 5.数组去重

  用set:

let nums = [5,5,1,1,54,]
const set = new Set(); for (let i = 0; i <= len; i++) {
  // set.has(num)判断该值是否在set中已存在,返回布尔值
if (!set.has(nums[i])) { set.add(nums[i]); } }
// 将类数组对象或可便利对象转换为一个真正的数组
let arr = Array.from(set)

 6.二分查找

// 简单的二分查找
    var binarySearch = function (nums, target) {
        let left = 0
        let right = nums.length - 1

        while (left <= right) {
            // 取中间节点
            let mid = (right + left) / 2
            if (nums[mid] == target) {
                return mid
            } else if (nums[mid] < target) {
                // 更换左边界
                left = mid + 1
            } else if (nums[mid] > target) {
                // 更换右边界
                right = mid - 1
            }
        }
        return -1
    }
// 寻找右侧边界
    let binarySearchRight = function (nums, target) {
        if (nums.length == 0) return -1
        // 因为初始化是right = num.length,所以决定了left=mid+1和right=mid(mid给right相当于right=num.length,即右边界都取不到)
        let left = 0, right = num.length

        while (left < right) {
            let mid = (left + right) / 2
            if (nums[mid] == target) {
                // 有差别,收紧左侧边界
                left = mid + 1
                // 如果target大于mid值,那么增大left,使区间不断向右收缩,即寻找右侧端点
            } else if (nums[mid] < target) {
                left = mid + 1
                // 如果target小于mid值,那么更换右端点
            } else if (nums[mid] > target) {
                right = mid
            }
        }
        // 有差别
        return left - 1
    }

    // 寻找左侧边界
    let binarySearchRight = function (nums, target) {
        if (nums.length == 0) return -1
        let left = 0, right = num.length

        while (left < right) {
            let mid = (left + right) / 2
            if (nums[mid] == target) {
                // 有差别,收紧右侧边界以锁定左侧边界
                right = mid
            } else if (nums[mid] < target) {
                left = mid + 1
            } else if (nums[mid] > target) {
                right = mid
            }
        }
        // 有差别
        return left
    }

 

posted @ 2020-11-22 10:44  ajjoker  阅读(582)  评论(0)    收藏  举报