一、手写算法

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

思路

  • 数组首先想到了双指针,但是知道怎么下手,就采用了暴力解法
  • 借助答案分析、理解,完成了指针方法的实现

    代码

    ```javascript /**
    • 1.暴力解法
    • 1)找到字符c的下标存入数组;2)循环找到数组下标到c最近的距离min,存入新数组并返回结果;
    • @param {string} s
    • @param {character} c
    • @return {number[]} */ var shortestToChar = function(s, c) { var arr = []; var resultArr = []; for(var i = 0;i<=s.length-1;i++){
      1. if(s[i]=== c){
      2. arr.push(i)
      3. }
      } for(var i = 0;i<=s.length-1;i++){ var min = Math.abs(i - arr[0]);
      for(var j = 1;j<=arr.length-1;j++){
          if(Math.abs(i - arr[j]) < min){
              min = Math.abs(i - arr[j])
          }
      }
      resultArr.push(min)
      
      } return resultArr; };

/**

  • 1.指针
  • 1)两个指针同时从当前位置向左向右开始寻找c;2)找到c比较两个指针的最小量存入数组,返回结果
  • @param {string} s
  • @param {character} c
  • @return {number[]} */ var shortestToChar = function(s, c) { var len = s.length,res=[]; for (let i = 0; i <= len - 1; i++) { var L=i,R=i, result = Infinity; while(L>=0){ if(s[L] === c){
     result = Math.min(result,i-L)
     break;
    
    } L—; } while(R<len){ if(s[R] === c){
     result = Math.min(result,R-i)
     break;
    
    } R++; } res.push(result) } return res; };
<a name="fbzED"></a>
### 复杂度分析

1. 暴力解法
- 时间复杂度:O(n*c的个数)
- 空间复杂度:O(n)
2. 双指针(左右指针)
- 时间复杂度:o(n^2)
- 空间复杂度:O(1)
<a name="Ghcnm"></a>
## 二、编程题
```javascript
2.编程题
实现symbol polyfill
//题解:如果浏览器不支持情况下 写出让代码让浏览器支持symbol
// 实现symbol polyfill
var SymbolPolyfill = function Symbol(description) {
  // 实现特性第 2 点:Symbol 函数前不能使用 new 命令
  if (this instanceof SymbolPolyfill)
    throw new TypeError('Symbol is not a constructor');

  // 实现特性第 5 点:如果 Symbol 的参数是一个对象,就会调用该对象的 toString 方法,将其转为字符串,然后才生成一个 Symbol 值。
  var descString =
    description === undefined ? undefined : String(description);

  var symbol = Object.create(null);

  Object.defineProperties(symbol, {
    __Description__: {
      value: descString,
      writable: false,
      enumerable: false,
      configurable: false,
    },
  });

  // 实现特性第 6 点,因为调用该方法,返回的是一个新对象,两个对象之间,只要引用不同,就不会相同
  return symbol;
};

var s1 = SymbolPolyfill();
var s2 = SymbolPolyfill();
console.log(s1 === s2); // false
var s3 = SymbolPolyfill('abc');
var s4 = SymbolPolyfill('abc');
console.log(s3 === s4); // false
console.log(s4 === 'abc'); // false