# 問題
```
/**
* 编码题一:判断括号匹配
* 说明:给定一个只包含 '() {} []' 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("")
}
```