算法题:

https://leetcode-cn.com/problems/shortest-distance-to-a-character/

给你一个字符串 s 和一个字符 c ,且 c 是 s 中出现过的字符。

返回一个整数数组 answer ,其中 answer.length == s.length 且 answer[i] 是 s 中从下标 i 到离它 最近 的字符 c 的 距离 。

两个下标 i 和 j 之间的 距离 为 abs(i - j) ,其中 abs 是绝对值函数。

示例 1:

输入:s = “loveleetcode”, c = “e”
输出:[3,2,1,0,1,0,0,1,2,2,1,0]
解释:字符 ‘e’ 出现在下标 3、5、6 和 11 处(下标从 0 开始计数)。
距下标 0 最近的 ‘e’ 出现在下标 3 ,所以距离为 abs(0 - 3) = 3 。
距下标 1 最近的 ‘e’ 出现在下标 3 ,所以距离为 abs(1 - 3) = 2 。
对于下标 4 ,出现在下标 3 和下标 5 处的 ‘e’ 都离它最近,但距离是一样的 abs(4 - 3) == abs(4 - 5) = 1 。
距下标 8 最近的 ‘e’ 出现在下标 6 ,所以距离为 abs(8 - 6) = 2 。
示例 2:

输入:s = “aaab”, c = “b”
输出:[3,2,1,0]

提示:
1 <= s.length <= 104
s[i] 和 c 均为小写英文字母
题目数据保证 c 在 s 中至少出现一次

  1. var shortestToChar = function (s, c) {
  2. let left = 0
  3. let right = 0
  4. let arr = []
  5. for (let i = 0; i < s.length; i++) {
  6. left = i
  7. right = i
  8. while (!(left < 0 && right > s.length)) {
  9. if (right <= s.length - 1 && s[right] === c) {
  10. arr.push(right - i)
  11. break
  12. } else if (left >= 0 && s[left] === c) {
  13. arr.push(i - left)
  14. break
  15. } else {
  16. if (right < s.length - 1) {
  17. right++
  18. }
  19. if (left > 0) {
  20. left--
  21. }
  22. }
  23. }
  24. }
  25. return arr
  26. };

注意点:
双指针跳转方式

手写题

实现symbol polyfill
//题解:如果浏览器不支持情况下 写出让代码让浏览器支持symbol

  1. (function (root) {
  2. // 4.唯一值
  3. var generaName = (function () {
  4. let idx = 0
  5. return function (str) {
  6. return str + '_' + (idx++)
  7. }
  8. })()
  9. // 1. 不能作为构造函数使用
  10. function SymbolPolyfill(str) {
  11. // 1. 不能作为构造函数使用
  12. if (this instanceof SymbolPolyfill) throw new TypeError('Symbol is not a constructor')
  13. var descString = str === undefined ? undefined : String(str)
  14. // SymbolPolyfill('2222').toString === 'Symbol(2222)'
  15. var symbol = Object.create({
  16. toString: function () {
  17. return 'Symbol(' + this._Name_ + ')'
  18. },
  19. valueOf: function () {
  20. return this
  21. }
  22. })
  23. // 2. Symbol('11').descrption === '11'
  24. Object.defineProperties(symbol, {
  25. 'description': {
  26. value: descString,
  27. writable: false,
  28. enumerable: false,
  29. configurable: false
  30. },
  31. '_Name_': {
  32. value: generaName(descString),
  33. writable: false,
  34. enumerable: false,
  35. configurable: false
  36. }
  37. });
  38. return symbol
  39. }
  40. // Symbol.for
  41. var forMap = {}
  42. Object.defineProperties(SymbolPolyfill, {
  43. 'for': {
  44. value: function (str) {
  45. var descString = str === undefined ? undefined : String(str)
  46. let d = forMap[descString] ? forMap[descString] : forMap[descString] = SymbolPolyfill(descString);
  47. return d
  48. },
  49. writable: true,
  50. enumerable: false,
  51. configurable: true
  52. },
  53. })
  54. root.SymbolPolyfill = SymbolPolyfill
  55. })(this)