---
# System prepended metadata

title: 問題

---

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