编程训练(二)

204 阅读3分钟

1. 解析url

/**
 * let url = 'http://www.domain.com/?user=anonymous&id=123&id=456&
 city=%E5%8C%97%E4%BA%AC&enabled'; /* 
 { user: 'anonymous', id: [ 123, 456 ], city: '北京', enabled: true }
 * 结果 { user: 'anonymous', id: [ 123, 456 ], 
 * // 重复出现的 key 要组装成数组,能被转成数字的就转成数字类型 
 city: '北京', // 中文需解码 
 enabled: true, // 未指定值得 key 约定为 true }*/ 
// 1. 解析url:
let url = 'http://www.domain.com/?user=anonymous&id=123&id=456&city=%E5%8C%97%E4%BA%AC&enabled';
function parseParam(url){
  var param = url.split('?')[1];
  var paramArr=param.split('&');
  var obj={};
  for (let i = 0; i < paramArr.length; i++) {
    if (/[=]/.test(paramArr[i])){
      let [k, v] = paramArr[i].split('=');
      v = /^\d+$/.test(v) ? +v : decodeURIComponent(v);
      obj[k]=obj[k]?[].concat(obj[k],v):v;
    }else{
      obj[paramArr[i]]=true;
    }
    
  }
  return obj;
}
console.log(parseParam(url));//{ user: 'anonymous', id: [ 123, 456 ], city: '北京', enabled: true }

2. 转换为驼峰命名

var s1 = "get-element-by-id" //转化为 getElementById
function change(str){
  var str=str.replace(/-(\w)/g,($0,$1)=>{
    return $1.toUpperCase();
  });
  return str
}
console.log(change(s1)); //getElementById

3.查找字符串中出现最多的字符和个数

//3.查找字符串中出现最多的字符和个数
var str = "abcabcabcbbcccccbbbb";
function findStrMax(str){
  let num=0;
  let char='';
  str=str.split('').sort().join('');//aabbbccc
  str.replace(/(\w)\1*/g,($0,$1)=>{
    if(num < $0.length){
      num = $0.length;
      char = $1;
    }
  })
  return `最多是${char}出现${num}次`
}
console.log(findStrMax(str)); //最多是b出现9次

4.利用正则解题

//1. 验证是否是身份证
function isCardNo(number){
  var reg = /(^\d{18}$)|(^\d{17}(\d|X|x)$)/
  return reg.test(number)
}
console.log(isCardNo('42112719950426502x')); //true
//2. 验证是否是邮箱
function isEmail(email){
  var reg = /[\w.]+@\w+\.(com|net|edu)/;
  return reg.test(email)
}
// 3.判断是否是手机号
function isPhoneNum(num){
  var reg=/^1[34578]\d{9}$/;
  return reg.test(num)
}
console.log(isPhoneNum(136672235741));

5.实现千位分隔符

// 5.实现千位分隔符
/**
保留三位小数
parseToMoney(1234.56);  //return '1,234.56'
parseToMoney(123456789); // return '123,456,789' 
parseToMoney(1087654.321); // return '1,087,654.321' */
var number = 1234.56;
function parseToMoney(number){
  number = parseFloat(number.toFixed(3))
  let strNum='' + number;
  let [integer, decimal] = strNum.split('.');
  integer = integer.replace(/(?=(\B(\d{3})+$))/g, ',');
  return decimal ? integer + '.' + decimal : integer
}
console.log(parseToMoney(number)); //1,234.56

6.字符串查找, b中是否包括a,若包括输出下标, 否则输出-1


// 6.字符串查找
/**
 *a = '34';b = '1234567'; // 返回 2 
  a='35';b='1234567'; // 返回 -1
  a='355';b='12354355'; // 返回 5 
 *
 * @param {*} a
 * @param {*} b
 */
function isContain(a, b){
  for (let i in b) {
    if(a[0]==b[i]){
      let temp=true;
      for(let j in a){
        if (a[j] !== b[~~i + ~~j]){
          temp = false;
        }
      }
      if (temp) {
        return i
      }
    }
  }
  return -1;
}
a = '34';
b = '1234567';
console.log(isContain(a, b));//2

7.前K个最大的元素

// (1) 排序取前K个元素
/**(2) 分治 随便取一个数 , 分成两堆 [max] [min],
 * 若max.length == k 返回[max];
 * 若max.length > k 继续在max中寻找前K个最大的数;
 * 若max.length < k 继续在min中寻找前K-max.length个最大的数;并拼接在max后
 */
 
 
 
// 9.分治策略求 前K个最大的元素

// (1) 排序取前K个元素
/**(2) 分治 随便取一个数 , 分成两堆 [max] [min],
 * 若max.length == k 返回[max];
 * 若max.length > k 继续在max中寻找前K个最大的数;
 * 若max.length < k 继续在min中寻找前K-max.length个最大的数;并拼接在max后
 */
const partArr = (arr)=>{
  let length=arr.length;
  let middle = ~~(length / 2);
  let mid=arr[middle];
  let maxArr=[];
  let minArr=[];
   // 数组长度为 2 的要特殊处理
   if (length === 2) {
     maxArr.push(Math.max(arr[0], arr[1]));
     minArr.push(Math.min(arr[0], arr[1]));
   } else {
    arr.forEach((item, index) => {
      if (index !== middle) {
        if (item < mid) {
          minArr.push(item);
        }
        if (item >= mid) {
          maxArr.push(item);
        }
      }
    })
    maxArr.push(mid);
   }
  
  return { maxArr,minArr }
};

const findMax=(arr,k)=>{
  if(arr.length<k){
    return arr;
  }
  const {maxArr,minArr}=partArr(arr);
  if(maxArr.length==k){
    return maxArr
  }
  if (maxArr.length > k){
    return findMax(maxArr,k);
  }
  if (maxArr.length < k){
    return maxArr.concat(findMax(minArr,k-maxArr.length));
  }
}

var arr=[1,3,2,4,5,8,7,0,8];
console.log(findMax(arr, 4)); //[ 7, 8, 6, 5 ]
 

10.二分查找,前提是数组是有序的,查找数字在数组中的下标

/*
 * @lc app=leetcode.cn id=704 lang=javascript
 *
 * [704] 二分查找
 */
/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
var search = function (nums, target) {
  return binarySearch(nums, target, 0, nums.length - 1);
};

function binarySearch(nums, target, start, end) {
  if (start > end) {
    return -1
  }
  const middle = Math.floor((start + end) / 2);
  if (nums[middle] == target) {
    return middle
  }
  if (nums[middle] < target) {
    return binarySearch(nums, target, middle + 1, end)
  }
  if (nums[middle] > target) {
    return binarySearch(nums, target, start, middle - 1)
  }
}

var nums = [0, 1, 3, 4, 4, 5, 8, 11, 18, 54], target = 18;
console.log(search(nums, target));