# 問題 ``` /** * 编码题一:判断括号匹配 * 说明:给定一个只包含 '() {} []' 6种字符的字符串, * 实现一个方法来检测该字符串是否合法,其规则为'()'、'{}'、'[]'必须互相匹配,可嵌套。 * 示例: * isValid('('); // false * isValid('()'); // true * isValid('()[]{}'); // true * isValid('{()[]}'); // true * isValid('(]'); // false * isValid('([)]'); // false * isValid('({}[]([]))'); // true */ function isValid() { } /** * 编码题二:数组按嵌套层次输出 * 说明:给定一个嵌套数组,输出每层的内容 * 示例: * parseArrayLevels([1, [3, ['x', 'y'], 2], [[5], 'a']]); * 输出:[[1], [3, 2, 'a'], ['x', 'y', 5]] */ function parseArrayLevels() { }; /** * 编码题三:字符串压缩 * 说明:将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。 * 压缩规则: * 1、仅压缩连续重复出现的字符。比如字符串“abcbc”由于无连续重复字符,压缩后的字符串还是”abcbc” * 2、压缩字段的格式为”字符重复的次数+字符” * 示例: * stringZip('cccddecc'); // '3c2de2c' * stringZip('adef'); // 'adef' * stringZip('aaaaa'); // '5a' */ function stringZip(str) { }; /** * 编码题四:实现一个检验对象是否循环指向的方法 * 说明:当一个对象存在对自身引用时,称之为循环指向 * 如`var o = { a: {} }; o.a = o;` * o -> a -> o,就形成循环指向 * 示例: * isCyclic(window); // true * isCyclic({}); // false * var o = {}; o.o = o; * isCyclic(o); // true * * var obj = { foo: { bar: { baz: { qux: {} } } } }; * obj.foo.bar.baz.qux = obj.foo; * isCyclic(obj); // true */ function isCyclic (o) { /* 代码实现 */ } /** * 编码题五:实现一个评星方法 * 说明: * 1. 可根据传入的评分和总数,返回评星结果(用 ★ 和 ☆ 描述) * 2. 评分必选项,四舍五入,总数可选,大于0的整数,默认为5 * 3. 对于评分为空或小于0、评分大于总数、总数小于0或总数非整数的情况,返回'errror' * * 示例: * getRate(4); // ★★★★☆ * getRate(4, 8); // ★★★★☆☆☆☆ * getRate(3.4); // ★★★☆☆ * getRate(5, 2); // 'error' * getRate(-2); // 'error' * getRate(3, 5.5); // 'error' */ // 用Math.round()四捨五入 並用數組創建result function getRate() { /* 代码实现 */ } ``` # 我寫的的答案 ``` // 1.用stack特性 function isValid(input){ var stack = {}; var size = 0; var left = ['(', '[', '{']; var right = [')', ']', '}']; for(var i = 0; i < input.length; i++){ if( left.indexOf(input[i]) !== -1 ){ stack[size] = input[i]; size++; } else if( right.indexOf(input[i]) !== -1 ){ if(size === 0) { return false; } var index = right.indexOf(input[i]); if(stack[size-1] === left[index] ){ size = size-1; } else { return false; } } } return size === 0; } //2.使用split特性 或flat()方法 function parseArrayLevels(arr) { /** 代码实现 */ // 方法1. let stringList = arr.toString().split("'").filter(ele=>{ return ele }) return stringList // 方法2. 也可用.flat()方法直接實現 }; // 3.用object['a'] 鍵值 這種方法 來記數. ex. object['a'] = object['a'] +1 (2) function stringZip(str) { /** 代码实现 */ let obj = {} for(let i=0;i<str.length;i++){ //如果還沒碰過 初始設1 obj[str[i]] = obj[str[i]] +1 || 1 } let result = '' for (const [key, value] of Object.entries(obj)) { //拼接字符串 if(parseInt(value)===1){ result += (key) }else{ result += (key) + (value) } } return result }; // 4. 用JSON.stringify 特性 或遞歸檢查 //方法一 JSON.stringify 會拋異常如果有自身引用 function isCyclic (obj) { /* 代码实现 */ try { JSON.stringify(obj); return false; } catch (e) { return true; } } //方法二 遞歸檢查 (有思路 但未完成) function isCyclic2 (o) { var visited = []; function check (o) { if (typeof o === 'object') { if (visited.indexOf(o) !== -1) {return true;} visited.push(o); //check if it has own property // ... } return false; } return check(o); } //5.用Math.round()四捨五入 並用數組創建result function getRate(stars,max=5) { /* 代码实现 */ stars = parseInt(stars) stars = Math.round(stars) max = parseInt(max) if(!stars || stars<0 || stars>max){ return 'error' } let result =[] for(let i=0;i<max;i++){ result.push("☆") } for(let i=0;i<stars;i++){ result[i] = '★' } return result.join("") } ```