https://leetcode-cn.com/problems/shortest-distance-to-a-character
function shortestToChar(s: string, c: string): number[] {
const result: number[] = [];
let prev = Infinity;
// 第一次遍历:从左往右
for(let i = 0; i < s.length; i++) {
if (s[i] === c) prev = i;
result[i] = Math.abs(i - prev);
}
// 第二次遍历:从右往左
for(let i = s.length - 1; i >= 0; i--) {
if (s[i] === c) prev = i;
result[i] = Math.min(Math.abs(i - prev), result[i]);
}
return result;
};
Symbol
值通过Symbol
函数生成,使用typeof
,结果为 “symbol”Symbol
函数前不能使用new
命令,否则会报错。这是因为生成的Symbol
是一个原始类型的值,不是对象。instanceof
的结果为false
Symbol
函数可以接受一个字符串作为参数,表示对Symbol
实例的描述,主要是为了在控制台显示,或者转为字符串时,比较容易区分。- 如果
Symbol
的参数是一个对象,就会调用该对象的toString
方法,将其转为字符串,然后才生成一个Symbol
值。 Symbol
函数的参数只是表示对当前Symbol
值的描述,相同参数的Symbol
函数的返回值是不相等的。Symbol
值不能与其他类型的值进行运算,会报错。Symbol
值可以显式转为字符串。Symbol
值可以作为标识符,用于对象的属性名,可以保证不会出现同名的属性。Symbol
作为属性名,该属性不会出现在for...in
、for...of
循环中,也不会被Object.keys()
、Object.getOwnPropertyNames()
、JSON.stringify()
返回。但是,它也不是私有属性,有一个Object.getOwnPropertySymbols
方法,可以获取指定对象的所有Symbol
属性名。- 如果我们希望使用同一个
Symbol
值,可以使用Symbol.for
。它接受一个字符串作为参数,然后搜索有没有以该参数作为名称的Symbol
值。如果有,就返回这个Symbol
值,否则就新建并返回一个以该字符串为名称的Symbol
值。 Symbol.keyFor
方法返回一个已登记的Symbol
类型值的key
。(function () { var root = this; var generateName = (function () { var postfix = 0; return function (descString) { postfix++; return '@@' + descString + '_' + postfix; } })(); function SymbolPolyfill(description) { if (this instanceof SymbolPolyfill) throw new TypeError('Symbol is not a constructor'); var descString = description === undefined ? undefined : String(description); var symbol = Object.create({ toString: function () { return this.__Name__; }, valueOf: function () { return this; } }); Object.defineProperties(symbol, { '__Description__': { value: descString, writable: false, enumerable: false, configurable: false }, '__Name__': { value: generateName(descString), writable: false, enumerable: false, configurable: false } }); return symbol; } var forMap = {}; Object.defineProperties(SymbolPolyfill, { for: { value: function (description) { var descString = description === undefined ? undefined : String(description); return forMap[descString] ? forMap[descString] : SymbolPolyfill(descString) }, writable: true, enumerable: false, configurable: true, }, keyFor: { value: function (symbol) { for (var key in forMap) { if (forMap[key] === symbol) return key; } }, writable: true, enumerable: false, configurable: true, } }); root.SymbolPolyfill = SymbolPolyfill; }())