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));