几道JS代码题

1、选择排序

选择排序,每次拿当前项与后面其他项进行比较,得到最小值的索引位置 然后把最小值和当前项交换位置

    function selectSort(arr) {
    let len = arr.length;
    let temp = null;
    let minIndex = null;
    for (let i = 0; i < len - 1; i++) { // 把当前值的索引作为最小值的索引一次去比较
        minIndex = i; // 假设当前项索引 为最小值索引
        for (let j = i + 1; j < len; j++) { // 当前项后面向一次比小
        if (arr[j] < arr[minIndex]) { // 比假设的值还要小 则保留最小值索引
        minIndex = j; // 找到最小值的索引位置
      }
    }
    // 将当前值和比较出的最小值交换位置
    if (i !== minIndex) {
       temp = arr[i]
       arr[i] = arr[minIndex];
       arr[minIndex] = temp;
    }
  }
  return arr;
}

复制代码

2、冒泡排序

冒泡排序,相邻两项进行比较,如果当前值大于后一项,则交换位置 方法1

    function swap(arr, i, j) {
        [arr[i], arr[j]] = [arr[j], arr[i]]
    }
    
    function bubleSort(arr) {
        let length = arr.length;
        let temp = null;
        for (let i = 0; i < length - 1; i++) { // 控制轮数
        let flag = false; // 当前这轮是否交换过标识
        for (let l = 0; l < length - i - 1; l++) { //控制每轮比较次数
            if (arr[l] > arr[l + 1]) {
            // temp = arr[l];
            // arr[l] = arr[l + 1];
            // arr[l + 1] = temp;
            swap(arr, l, l + 1);
            flag = true; // 如果发生过交换flag则为true
          } 
        }
        if (!flag) { // 优化  如果从头到尾比较一轮后 flag依然为false说明 已经排好序了 没必要在继续下去
           temp = null;
           return arr;
        }
      }
      return arr;
    }

复制代码

方法2

    function swap(arr, i, j) {
       [arr[i], arr[j]] = [arr[j], arr[i]]
    }

    function bubble_sort(arr) {
        for (let i = arr.length - 1; i >= 1; i--) {
            for (let j = 1; j <= i; j++) {
            arr[j - 1] > arr[j] && swap(arr, j - 1, j)
            }
        }
    return arr;
    }

    console.log(bubble_sort([1, 10, 3, 0]));

复制代码

3、数组去重
    const arr = [1, 2, 1, 2, 3, 4, 2, 1, 3];
    
    // 1 ES6
    let newArr = [...new Set(arr)];
    
    
    // 2
    const arr = [1, 2, 1, 2, 3, 4, 'l', 2, 1, 3, 'l'];
    const newArr = arr.filter(function(ele, index, array) {
    	return index === array.indexOf(ele)
    });
    console.log(newArr); // [ 1, 2, 3, 4, 'l' ]
    
    
    // 3
    Array.prototype.unique2 = function() {
        let newArr = [];
        let len = this.length;
        for(let i = 0; i < len; i++) {
            let cur = this[i];
            if(newArr.indexOf(cur) === -1) {
                newArr[newArr.length] = cur;
            }
        }
        return newArr;
    }
    console.log(arr.unique1());
    
    
    // 4
    Array.prototype.unique3 = function() {
        let newArr = this.slice(0);
        let len = this.length;
        let obj = {};
        for(let i = 0; i < len; i++) {
            let cur = newArr[i];
            if(obj[cur]) {
                newArr[i] = newArr[newArr.length - 1];
                newArr.length--;
                i--;
                continue;
            }
            obj[cur] = cur;
        }
        return newArr;
    }
    console.log(arr.unique3());
    
    
    // 5
    Array.prototype.unique4 = function() {
        let json = {}, newArr = [], len = this.length;
        for(var i = 0; i < len; i++) {
            let cur = this[i];
            if (typeof json[cur] == "undefined") {
                json[cur] = true;
                newArr.push(cur)
            }
        }
        return newArr;
    }
    console.log(arr.unique4());
复制代码

4、快速排序
    function quickSort(arr) {
        if (arr.length <= 1) return arr;
        let midIndex = Math.floor(arr.length / 2);
        let midNum = arr.splice(midIndex, 1)[0];
        let left = [];
        let right = [];
        for(let i = 0; i < arr.length; i++) {
             let cur = arr[i];
            if (cur <= midNum) {
            left.push(cur);
            } else {
            right.push(cur);
            }
        }
    return quickSort(left).concat(midNum, quickSort(right));
    }

    let arr = [2, 4, 12, 9, 22, 10, 18, 6];
    quickSort(arr);
复制代码

5、找出数组中重复出现过的元素
    // 例如:[1,2,4,4,3,3,1,5,3]
    // 输出:[1,3,4]
    let arr = [1, 2, 4, 4, 3, 3, 1, 5, 3];
    
    // 方法一
    function repeat1(arr){
    	var result = [], map = {};
    	arr.map(function(num){
    	if(map[num] === 1) result.push(num); // 等于1说明之前出现过一次 这次重复出现了
    		map[num] = (map[num] || 0) + 1; // 微妙之处 开始第一次出现无值 记为 0 + 1 = 1 下一次从1开始累加
    	});
    	return result;
    }
    console.log(repeat1(arr));
    
    
    
    // 方法二
    function repeat(arr) {
        let result = arr.filter((x, i, self) => {
            return self.indexOf(x) === i && self.lastIndexOf(x) !== i
        }); // 
        return result;
    }
    console.log(repeat(arr));
复制代码

6、将两个有序数组合并为一个排好序的大数组
    function mergeAry(left = [], right = []) {
        const result = [];
        while (left.length && right.length) {
            result.push(left[0] <= right[0] ? left.shift() : right.shift());
        }
        return result.concat(left, right);
    }
    
    console.log(mergeAry([1, 2, 3], [1, 4, 8, 9])); // [ 1, 1, 2, 3, 4, 8, 9 ]
复制代码

7、数组中按照数字重复出现的次数进行排序
    // 如果次数相同 则按照值排序 比如  2, 2, 2和 1, 1, 1  应排序为 [1, 1, 1, 2, 2, 2]
    // 比如 [1,2,1,2,1,3,4,5,4,5,5,2,2] => [3, 4, 4, 1, 1, 1, 5, 5, 5, 2, 2, 2, 2]

    let arr = [9, 7, 7, 1, 2, 1, 2, 1, 3, 4, 5, 4, 5, 5, 2, 2];
    function sortArray(arr) {
        let obj = {};
        let newArr = [];
        for(let i = 0; i < arr.length; i++) {
            let cur = arr[i];
            if(obj[cur]){
            obj[cur].push(cur);
            continue;
            }
            obj[cur] = [cur];
        }
        for(let k in obj) {
            if(obj.hasOwnProperty(k)) {
            newArr.push(obj[k])
            }
        }
        newArr.sort((a, b) => {
            if(a.length === b.length){
            return a[0] - b[0];
            }
            return a.length - b.length;
        });
        newArr = newArr.reduce((prev, cur) => prev.concat(cur));
        return newArr;
    }
      console.log(sortArray(arr)); // [ 3, 9, 4, 4, 7, 7, 1, 1, 1, 5, 5, 5, 2, 2, 2, 2 ]


复制代码

8、数组展平
    > 将[[1, 2], 3, [[[4], 5]]] 展平为 [1, 2, 3, 4, 5]
    
    let arr = [[1, 2], 3, [[[4], 5]]]; // 数组展平
    function flatten(arr) {
        return [].concat(
            ...arr.map(x => Array.isArray(x) ? flatten(x) : x)
        )
    }
复制代码

9、字符串去除相邻的重复项 如:'aabbccddeexxxxaa' => 'abcdexa'
    // 正则表达式
    let str = 'aabbccddeexxxxaa';
    function uniq1(str) {
        // return str.replace(/([a-z])(\1){1,}/g, '$1');
        return str.replace(/(.)(?=\1)/g, '');
    }
    console.log(uniq1(str));
    
    
    // 数组方式
    function uniq2(str) {
        let arr = str.split('');
        let newArr = [arr[0]];
        for(let i = 1; i < arr.length; i++) {
            let cur = arr[i];
            if (cur !== newArr[newArr.length - 1]) {
                newArr.push(cur);
            }
        }
        return newArr.join('');
    }
    console.log(uniq2(str));
    
复制代码

10、求相邻两项最大和
    // 一
    let arr1 = [-1, 3, 1, -5, 2]; // 如 [2, 4, -4, -3] => 4
    function sum(arr) {
        let prev = arr[0];
        let sumArr = [];
        let len = arr.length;
        for(let i = 1; i < len; i++) {
            let cur = arr[i];
            sumArr.push(cur + prev);
            prev = cur;
        }   
        return Math.max(...sumArr);
    }
    console.log(sum(arr1));
    
    // 二
    function maxsum(arr) {
        const M = [arr[0]];
        let max = M[0];
        
        for(let i = 1; i < arr.length; i++) {
            M[i] = Math.max(arr[i], M[i - 1] + arr[i]);
            max = Math.max(M[i], max);
        }
        return max;
    }

复制代码

11、千分符
    // 方法一:处理数字
    let str1 = 2123456789;
    let str2 = 2123456789.12;
    console.log(str1.toLocaleString()); // 2,123,456,789
    console.log(str2.toLocaleString()); // 2,123,456,789.12  
    
    
    
    // 方法二:处理字符串
    let str1 = '2123456789';
    let str2 = '2123456789.12';
    // 利用正向预查 匹配 开头一个数字\d 后面匹配这个数字后面必须是三个数字为一组为结尾或小数为结尾
    function thousandth(str) { 
        let reg = /\d(?=(?:\d{3})+(?:\.\d+|$))/g; 
        return str.replace(reg, '$&,');
    }
    console.log(thousandth(str1)); // 2,123,456,789
    console.log(thousandth(str2)); // 2,123,456,789.12

复制代码

12、找出数组中重复出现过的元素
    // 例如:[1,2,4,4,3,3,1,5,3]
    // 输出:[1,3,4]
    let arr = [1, 2, 4, 4, 3, 3, 1, 5, 3];

    // 方法一
    function repeat1(arr){
    	var result = [], map = {};
    	arr.map(function(num){
    	if(map[num] === 1) result.push(num); // 等于1说明之前出现过一次 这次重复出现了
    		map[num] = (map[num] || 0) + 1; // 微妙之处 开始第一次出现无值 记为 0 + 1 = 1 下一次从1开始累加
    	});
    	return result;
    }
    console.log(repeat1(arr));


    
    // 方法二
    function repeat(arr) {
        let result = arr.filter((x, i, self) => {
            return self.indexOf(x) === i && self.lastIndexOf(x) !== i
        }); // 
        return result;
    }
    console.log(repeat(arr));

复制代码

转载于:https://juejin.im/post/5c98eb5f5188252dab3ec67a

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值