一、手写算法
https://leetcode-cn.com/problems/max-chunks-to-make-sorted-ii/
思路
每一个分块和排序后的数组中对应的分块数字是一样的,只是排序不同。
代码
/**
* @param {number[]} arr
* @return {number}
*/
var maxChunksToSorted = function(arr) {
const sorted = [...arr];
sorted.sort((a, b) => a - b);
let count = 0,
sum1 = 0,
sum2 = 0;
for (let i = 0; i < arr.length; i++) {
sum1 += arr[i];
sum2 += sorted[i];
if (sum1 === sum2) {
count++;
}
}
return count;
};
复杂度分析
时间复杂度:
- 空间复杂度:
二、编程题
// 手写题:https://bigfrontend.dev/zh/problem/implement-your-own-URLSearchParams
class MyURLSearchParams {
/**
* @params {string} init
*/
constructor(init) {
this.initParams = init.split('?')[init.split('?').length-1];
this.params = []
this.initParams.split('&').forEach((item,index)=>{
const [key,value] = item.split('=');
this.params[index] = {name:key,value};
})
}
/**
* @params {string} name
* @params {any} value
*/
append(name, value) {
var val = value === undefined ? 'undefined' : value === NaN ? 'NaN' : value.toString()
return this.params[this.params.length] = {name:name,value:val}
}
/**
* @params {string} name
*/
delete(name) {
return this.params = this.params.filter((item)=>{
if(name !== item.name){
return item.value
}
})
}
/**
* @returns {Iterator}
*/
entries() {
var items = [];
this.params.forEach(function(item) {
items.push([item.name, item.value]);
});
var iterator = {
next: function() {
var value = items.shift();
return {done: value === undefined, value: value};
}
};
if (Symbol.iterator) {
iterator[Symbol.iterator] = function() {
return iterator;
};
}
return iterator;
};
makeIterator() {
let nextIndex = 0;
let that = this;
return {
next: function () {
return nextIndex < that.params.length
? { value:[that.params[nextIndex++].name,that.params[nextIndex++].value],
done: false
} : {
done: true
};
}
};
}
/**
* @param {(value, key) => void} callback
*/
forEach(callback) {
for(var i = 0; i<= this.params.length - 1; i++){
callback(this.params[i].value,this.params[i].name)
}
}
/**
* @param {string} name
* returns the first value of the name
*/
get(name) {
return this.getAll(name).length > 0 ?this.getAll(name)[0] :null
}
/**
* @param {string} name
* @return {string[]}
* returns the value list of the name
*/
getAll(name) {
var all = this.params.filter((item)=>{
if(name.split('?')[name.split('?').length - 1] === item.name){
return item.value
}
})
return all.map((item) => {return item.value})
}
/**
* @params {string} name
* @return {boolean}
*/
has(name) {
var flag = false;
for(var i = 0; i<= this.params.length - 1; i++){
if(name === this.params[i].name){
flag = true;
return flag;
}
}
return flag;
}
/**
* @return {Iterator}
*/
keys() {
return this.params.map((item) => {return item.name})
}
/**
* @param {string} name
* @param {any} value
*/
set(name, value) {
if(this.has(name)){
this.params.forEach((item,index)=>{
if(name === item.name){
console.log(value instanceof Object)
if(value instanceof Object){
this.params[index] = {name,value:value.toString()}
}else{
this.params[index] = {name,value:value.toString()}
}
}
})
}else{
this.append(name,value)
}
console.log('this.params',this.params)
}
// sor all key/value pairs based on the keys
sort() {
this.params = this.params.sort((a, b) => a.name < b.name ? -1 : a.name > b.name ? 1 : 0);
console.log(this.params)
}
/**
* @return {string}
*/
toString() {
var str = ''
this.params.forEach((item)=>{
str = str + `${item.name}=${item.value}&`;
})
return str.substring(0,str.length-1);
}
/**
* @return {Iterator} values
*/
values() {
return this.params.map((item) => {return item.value})
}
}