算法题:
- 链接: https://leetcode-cn.com/problems/max-chunks-to-make-sorted-ii/
- 描述及示例 ```javascript 1.这个问题和“最多能完成排序的块”相似,但给定数组中的元素可以重复,输入数组最大长度为2000,其中的元素最大为10**8。 2.arr是一个可能包含重复元素的整数数组,我们将这个数组分割成几个“块”,并将这些块分别进行排序。之后再连接起来,使得连接的结果和按升序排序后的原数组相同。 3.我们最多能将数组分成多少块? //示例1 输入: arr = [5,4,3,2,1] 输出: 1 解释: 将数组分成2块或者更多块,都无法得到所需的结果。 例如,分成 [5, 4], [3, 2, 1] 的结果是 [4, 5, 1, 2, 3],这不是有序的数组。
// 示例2 输入: arr = [2,1,3,4,4] 输出: 4 解释: 我们可以把它分成两块,例如 [2, 1], [3, 4, 4]。 然而,分成 [2, 1], [3], [4], [4] 可以得到最多的块数。
- 答案
```javascript
var maxChunksToSorted = function(arr) {
const sortArr = [...arr]
sorted.sort((a, b) => a - b);
console.log('sortArr',sortArr)
let count = 0;
let sortSum = 0;
let arrSum = 0;
for (let i = 0,len=arr.length;i<len;i++ ) {
sortSum +=sortArr[i]
arrSum += arr[i]
if (sortSum===arrSum) {
count++
sortSum = arrSum = 0
}
}
return count
};
解题思路
链接:https://bigfrontend.dev/zh/problem/implement-your-own-URLSearchParams
- 题目:你能否自己实现一个和URLSearchParams基本一样的MyURLSearchParams?
解题
class MyURLSearchParams {
/**
* @params {string} init
*/
constructor(init) {
this.params = init
.replace(/^\?/,'')
.split('&')
.map(item=>item.split('='))
}
/**
* @params {string} name
* @params {any} value
*/
append(name, value) {
this.params.push([name,String(value)])
}
/**
* @params {string} name
*/
delete(name) {
this.params = this.params.filter((item) => item[0] !== name)
return null
}
/**
* @returns {Iterator}
*/
*entries() {
for (let i=0,len=this.params.length;i<len;i++) {
yield [this.params[i][0],this.params[i][1]]
}
}
/**
* @param {(value, key) => void} callback
*/
forEach(callback) {
for (let i=0,len=this.params.length;i<len;i++) {
callback.apply(this,[this.params[i][1],this.params[i][0]])
}
}
/**
* @param {string} name
* returns the first value of the name
*/
get(name) {
let tmp = []
for (let i=0,len=this.params.length;i<len;i++) {
if (name === this.params[i][0]) {
tmp.push(this.params[i][1])
}
}
return tmp[0] || null
}
/**
* @param {string} name
* @return {string[]}
* returns the value list of the name
*/
getAll(name) {
let tmp = []
for (let i=0,len=this.params.length;i<len;i++) {
if (name === this.params[i][0]) {
tmp.push(this.params[i][1])
}
}
return tmp
}
/**
* @params {string} name
* @return {boolean}
*/
has(name) {
for (let i=0,len=this.params.length;i<len;i++) {
if (name === this.params[i][0]) {
return true
}
}
return false
}
/**
* @return {Iterator}
*/
*keys() {
for (let i=0,len=this.params.length;i<len;i++) {
yield [this.params[i][0]]
}
}
/**
* @param {string} name
* @param {any} value
*/
set(name, value) {
const exists = this.params.some((param) => {
if (param[0] !== name) return false
param[1] = String(value)
return true
})
if (!exists) {
this.append(name, value)
}
}
// sor all key/value pairs based on the keys
sort() {
this.params.sort((a, b) => {
if (a[0] > b[0]) return 1
if (a[0] < b[0]) return -1
return 0
})
}
/**
* @return {string}
*/
toString() {
return this.params.map(item=>item.join('=')).join('&')
}
/**
* @return {Iterator} values
*/
values() {
let tmp = []
for (let i=0,len=this.params.length;i<len;i++) {
tmp.push( this.params[i][1])
}
return tmp
}
}
遇到的问题
- 知道迭代器这个东西,但是要到返回值的时候不知道怎么写
- get 返回值考虑不充分,没有考虑没有值的情况
- sort 掌握不够熟练