一、手写算法

https://leetcode-cn.com/problems/max-chunks-to-make-sorted-ii/

思路

  • 每一个分块和排序后的数组中对应的分块数字是一样的,只是排序不同。

    代码

    1. /**
    2. * @param {number[]} arr
    3. * @return {number}
    4. */
    5. var maxChunksToSorted = function(arr) {
    6. const sorted = [...arr];
    7. sorted.sort((a, b) => a - b);
    8. let count = 0,
    9. sum1 = 0,
    10. sum2 = 0;
    11. for (let i = 0; i < arr.length; i++) {
    12. sum1 += arr[i];
    13. sum2 += sorted[i];
    14. if (sum1 === sum2) {
    15. count++;
    16. }
    17. }
    18. return count;
    19. };

    复杂度分析

  • 时间复杂度:

  • 空间复杂度:

二、编程题

  1. // 手写题:https://bigfrontend.dev/zh/problem/implement-your-own-URLSearchParams
  1. class MyURLSearchParams {
  2. /**
  3. * @params {string} init
  4. */
  5. constructor(init) {
  6. this.initParams = init.split('?')[init.split('?').length-1];
  7. this.params = []
  8. this.initParams.split('&').forEach((item,index)=>{
  9. const [key,value] = item.split('=');
  10. this.params[index] = {name:key,value};
  11. })
  12. }
  13. /**
  14. * @params {string} name
  15. * @params {any} value
  16. */
  17. append(name, value) {
  18. var val = value === undefined ? 'undefined' : value === NaN ? 'NaN' : value.toString()
  19. return this.params[this.params.length] = {name:name,value:val}
  20. }
  21. /**
  22. * @params {string} name
  23. */
  24. delete(name) {
  25. return this.params = this.params.filter((item)=>{
  26. if(name !== item.name){
  27. return item.value
  28. }
  29. })
  30. }
  31. /**
  32. * @returns {Iterator}
  33. */
  34. entries() {
  35. var items = [];
  36. this.params.forEach(function(item) {
  37. items.push([item.name, item.value]);
  38. });
  39. var iterator = {
  40. next: function() {
  41. var value = items.shift();
  42. return {done: value === undefined, value: value};
  43. }
  44. };
  45. if (Symbol.iterator) {
  46. iterator[Symbol.iterator] = function() {
  47. return iterator;
  48. };
  49. }
  50. return iterator;
  51. };
  52. makeIterator() {
  53. let nextIndex = 0;
  54. let that = this;
  55. return {
  56. next: function () {
  57. return nextIndex < that.params.length
  58. ? { value:[that.params[nextIndex++].name,that.params[nextIndex++].value],
  59. done: false
  60. } : {
  61. done: true
  62. };
  63. }
  64. };
  65. }
  66. /**
  67. * @param {(value, key) => void} callback
  68. */
  69. forEach(callback) {
  70. for(var i = 0; i<= this.params.length - 1; i++){
  71. callback(this.params[i].value,this.params[i].name)
  72. }
  73. }
  74. /**
  75. * @param {string} name
  76. * returns the first value of the name
  77. */
  78. get(name) {
  79. return this.getAll(name).length > 0 ?this.getAll(name)[0] :null
  80. }
  81. /**
  82. * @param {string} name
  83. * @return {string[]}
  84. * returns the value list of the name
  85. */
  86. getAll(name) {
  87. var all = this.params.filter((item)=>{
  88. if(name.split('?')[name.split('?').length - 1] === item.name){
  89. return item.value
  90. }
  91. })
  92. return all.map((item) => {return item.value})
  93. }
  94. /**
  95. * @params {string} name
  96. * @return {boolean}
  97. */
  98. has(name) {
  99. var flag = false;
  100. for(var i = 0; i<= this.params.length - 1; i++){
  101. if(name === this.params[i].name){
  102. flag = true;
  103. return flag;
  104. }
  105. }
  106. return flag;
  107. }
  108. /**
  109. * @return {Iterator}
  110. */
  111. keys() {
  112. return this.params.map((item) => {return item.name})
  113. }
  114. /**
  115. * @param {string} name
  116. * @param {any} value
  117. */
  118. set(name, value) {
  119. if(this.has(name)){
  120. this.params.forEach((item,index)=>{
  121. if(name === item.name){
  122. console.log(value instanceof Object)
  123. if(value instanceof Object){
  124. this.params[index] = {name,value:value.toString()}
  125. }else{
  126. this.params[index] = {name,value:value.toString()}
  127. }
  128. }
  129. })
  130. }else{
  131. this.append(name,value)
  132. }
  133. console.log('this.params',this.params)
  134. }
  135. // sor all key/value pairs based on the keys
  136. sort() {
  137. this.params = this.params.sort((a, b) => a.name < b.name ? -1 : a.name > b.name ? 1 : 0);
  138. console.log(this.params)
  139. }
  140. /**
  141. * @return {string}
  142. */
  143. toString() {
  144. var str = ''
  145. this.params.forEach((item)=>{
  146. str = str + `${item.name}=${item.value}&`;
  147. })
  148. return str.substring(0,str.length-1);
  149. }
  150. /**
  151. * @return {Iterator} values
  152. */
  153. values() {
  154. return this.params.map((item) => {return item.value})
  155. }
  156. }