算法题:

  • 链接: 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] 可以得到最多的块数。

  1. - 答案
  2. ```javascript
  3. var maxChunksToSorted = function(arr) {
  4. const sortArr = [...arr]
  5. sorted.sort((a, b) => a - b);
  6. console.log('sortArr',sortArr)
  7. let count = 0;
  8. let sortSum = 0;
  9. let arrSum = 0;
  10. for (let i = 0,len=arr.length;i<len;i++ ) {
  11. sortSum +=sortArr[i]
  12. arrSum += arr[i]
  13. if (sortSum===arrSum) {
  14. count++
  15. sortSum = arrSum = 0
  16. }
  17. }
  18. return count
  19. };
  • 解题思路

    • 将数组排序,如果数组arr 和排序数组的累计和想等,那么就是一个块

      手写题:

  • 链接:https://bigfrontend.dev/zh/problem/implement-your-own-URLSearchParams

  • 题目:你能否自己实现一个和URLSearchParams基本一样的MyURLSearchParams?
  • 解题

    1. class MyURLSearchParams {
    2. /**
    3. * @params {string} init
    4. */
    5. constructor(init) {
    6. this.params = init
    7. .replace(/^\?/,'')
    8. .split('&')
    9. .map(item=>item.split('='))
    10. }
    11. /**
    12. * @params {string} name
    13. * @params {any} value
    14. */
    15. append(name, value) {
    16. this.params.push([name,String(value)])
    17. }
    18. /**
    19. * @params {string} name
    20. */
    21. delete(name) {
    22. this.params = this.params.filter((item) => item[0] !== name)
    23. return null
    24. }
    25. /**
    26. * @returns {Iterator}
    27. */
    28. *entries() {
    29. for (let i=0,len=this.params.length;i<len;i++) {
    30. yield [this.params[i][0],this.params[i][1]]
    31. }
    32. }
    33. /**
    34. * @param {(value, key) => void} callback
    35. */
    36. forEach(callback) {
    37. for (let i=0,len=this.params.length;i<len;i++) {
    38. callback.apply(this,[this.params[i][1],this.params[i][0]])
    39. }
    40. }
    41. /**
    42. * @param {string} name
    43. * returns the first value of the name
    44. */
    45. get(name) {
    46. let tmp = []
    47. for (let i=0,len=this.params.length;i<len;i++) {
    48. if (name === this.params[i][0]) {
    49. tmp.push(this.params[i][1])
    50. }
    51. }
    52. return tmp[0] || null
    53. }
    54. /**
    55. * @param {string} name
    56. * @return {string[]}
    57. * returns the value list of the name
    58. */
    59. getAll(name) {
    60. let tmp = []
    61. for (let i=0,len=this.params.length;i<len;i++) {
    62. if (name === this.params[i][0]) {
    63. tmp.push(this.params[i][1])
    64. }
    65. }
    66. return tmp
    67. }
    68. /**
    69. * @params {string} name
    70. * @return {boolean}
    71. */
    72. has(name) {
    73. for (let i=0,len=this.params.length;i<len;i++) {
    74. if (name === this.params[i][0]) {
    75. return true
    76. }
    77. }
    78. return false
    79. }
    80. /**
    81. * @return {Iterator}
    82. */
    83. *keys() {
    84. for (let i=0,len=this.params.length;i<len;i++) {
    85. yield [this.params[i][0]]
    86. }
    87. }
    88. /**
    89. * @param {string} name
    90. * @param {any} value
    91. */
    92. set(name, value) {
    93. const exists = this.params.some((param) => {
    94. if (param[0] !== name) return false
    95. param[1] = String(value)
    96. return true
    97. })
    98. if (!exists) {
    99. this.append(name, value)
    100. }
    101. }
    102. // sor all key/value pairs based on the keys
    103. sort() {
    104. this.params.sort((a, b) => {
    105. if (a[0] > b[0]) return 1
    106. if (a[0] < b[0]) return -1
    107. return 0
    108. })
    109. }
    110. /**
    111. * @return {string}
    112. */
    113. toString() {
    114. return this.params.map(item=>item.join('=')).join('&')
    115. }
    116. /**
    117. * @return {Iterator} values
    118. */
    119. values() {
    120. let tmp = []
    121. for (let i=0,len=this.params.length;i<len;i++) {
    122. tmp.push( this.params[i][1])
    123. }
    124. return tmp
    125. }
    126. }
  • 遇到的问题

    • 知道迭代器这个东西,但是要到返回值的时候不知道怎么写
    • get 返回值考虑不充分,没有考虑没有值的情况
    • sort 掌握不够熟练