算法题

  • 题目:
    • 链接:https://leetcode-cn.com/problems/decode-string/
    • 描述:
      • 给定一个经过编码的字符串,返回它解码后的字符串编码
      • 规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。
      • 注意 k 保证为正整数你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。
      • 此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。
  • 示例 ```javascript 示例1 输入:s = “3[a]2[bc]” 输出:”aaabcbc”

示例2 输入:s = “3[a2[c]]” 输出:”accaccacc”

  1. - 答案
  2. ```javascript
  3. //使用了api push pop
  4. var decodeString = function(s) {
  5. let numArr = []
  6. let strArr = []
  7. let num=0
  8. let result = ''
  9. for (let i=0,len=s.length;i<len;i++) {
  10. // 如果是数字,则压进数组中
  11. if (/\d/.test(s[i])) {
  12. num = num*10+Number(s[i])
  13. } else if (s[i]=== '[') {
  14. // 如果是 [ 压入栈中
  15. numArr.push (num)
  16. num = 0
  17. strArr.push(result)
  18. result = ''
  19. } else if (s[i] === ']') {
  20. result = strArr.pop() + result.repeat(numArr.pop())
  21. } else {
  22. // 如果是字母拼接
  23. result +=s[i]
  24. }
  25. }
  26. return result
  27. };
  28. // 不适用api
  29. var decodeString = function(s) {
  30. let numArr = []
  31. let strArr = []
  32. let num=0
  33. let result = ''
  34. let numIdx = 0
  35. let strIdx = 0
  36. for (let i=0,len=s.length;i<len;i++) {
  37. // 如果是数字,则压进数组中
  38. if (/\d/.test(s[i])) {
  39. num = num*10+Number(s[i])
  40. } else if (s[i]=== '[') {
  41. // 如果是 [ 压入栈中
  42. numArr[numIdx] = num
  43. num = 0
  44. numIdx++
  45. strArr[strIdx] = result
  46. result = ''
  47. strIdx++
  48. } else if (s[i] === ']') {
  49. let repeatNum = numArr[numIdx-1]
  50. numIdx--
  51. let tmpStr = strArr[strIdx-1]
  52. strIdx--
  53. result = tmpStr + result.repeat(repeatNum)
  54. } else {
  55. // 如果是字母拼接
  56. result +=s[i]
  57. }
  58. }
  59. return result
  60. };

手写题:

https://bigfrontend.dev/zh/problem/implement-Object.is
Object.is() 和===基于一致,除了以下情况:

  1. Object.is(0, -0) // false
  2. 0 === -0 // true
  3. Object.is(NaN, NaN) // true
  4. NaN === NaN // false
  • 解答
    1. // 0===-0
    2. if (a === b) {
    3. return a !== 0 || 1 / a === 1 / b;
    4. }
    5. //NaN不等于自己
    6. return a !== a && b !== b;