// 声明了一个WeakMap类型的变量items const items = new WeakMap(); // 谁都可以改动它
class Stack { constructor () { // 在constructor中,以this为键,把代表栈的数组存入items items.set(this, []); } push(element) { // 从WeakMap中取出值,即以this为键从items中取值 let s = items.get(this); s.push(element); } pop() { let s = items.get(this); let r = s.pop(); return r; } //其他方法 }
itmes在Stack类里是真正的所有属性了。
使用闭包:
1 2 3 4 5 6 7 8 9 10 11 12
// 当Stack函数里的构造函数被调用时,会返回Stack类的一个实例 let Stack = (function () { const items = new WeakMap(); class Stack { constructor () { items.set(this, []); } //其他方法 } return Stack; //当被调用时,会返回Stack类的一个实例 })(); // 使用这种方法,扩展类无法继承私有属性
十进制转二进制问题算法
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
function divideBy2(decNumber){ var remStack = new Stack(), rem, binaryString = ''; while (decNumber > 0){ rem = Math.floor(decNumber % 2); remStack.push(rem); decNumber = Math.floor(decNumber / 2); } while (!remStack.isEmpty()){ binaryString += remStack.pop().toString(); } return binaryString; }
十进制转换成任何进制
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
function baseConverter(decNumber, base){ var remStack = new Stack(), rem, baseString = '', // 多了digits digits = '0123456789ABCDEF'; // 基数 while (decNumber > 0){ rem = Math.floor(decNumber % base); remStack.push(rem); decNumber = Math.floor(decNumber / base); } while (!remStack.isEmpty()){ baseString += digits[remStack.pop()]; } return baseString; }
两数之和
解题思路:
暴力法
哈希表法
示例伪代码:
1 2 3 4 5 6 7 8 9
func(nums,target) -> [] result = []; [0,1] 长度为2 for i in [0, len(nums)]; // 不动 for j in [i+1, len(nums)]; // 移动 sum = nums[i]+nums[j]; if sm == target; result[0] = i result[1] = j result result
伪代码:
1 2 3 4 5 6 7 8 9 10 11 12 13
func(nums, target) -> []; result = [] map = HashTable()
for i in [0, len(nums)]; map.add(nums[i], i);
for j in [0, len(nums)]; diff = target - nums[j] if(map.containskey(diff) and map.get(diff) != j) result[0] = j result[1] = map.get(diff) return result
var isValid = function (s) { let valid = true; const stack = []; const mapper = { "{": "}", "[": "]", "(": ")", };
for (let i in s) { const v = s[i]; if (["(", "[", "{"].indexOf(v) > -1) { stack.push(v); } else { const peak = stack.pop(); if (v !== mapper[peak]) { return false; } } }
fun(n) -> [] result = [] backtracking(n,result,0,0, "") return result backtracking(n,result,left,right,str) -> void if right > left return if left == right == n result.add(str) return if left<n backtracking(n,result,left+1,right,str+"(") if right<left backtracking(n,result,left,right+1,str+")")