简易的单词学习系统设计

这是一个单词学习系统设计。

WordLearningSys。构造方法,初始化单词数量,目标次数。

learn(num),返回挑选的单词的序号从小到大排序的数组。如果num大于单词的数量wordNum,则返回wordNum个单词。如果num小于单词的数量wordNum,则返回num个单词。

所选的单词的剩余学习次数必须大于零。优先选择剩余学习次数多的单词,如果剩余学习次数一样,则选择序号小的。学习后,单词的剩余次数要减一。

reset方法,重置数组中序号的单词的剩余次数为初始目标学习次数。

query 方法,查询还剩下多少个单词需要学习。

下面是一个符合要求的 WordLearningSys 类的设计:

class WordLearningSys {
    constructor(wordNum, targetNum) {
        this.wordNum = wordNum;
        this.targetNum = targetNum;
        this.words = [];
        for (let i = 0; i < wordNum; i++) {
            let word = {
                id: i,
                count: targetNum
            };
            this.words.push(word);
        }
    }

    learn(num) {
        let count = Math.min(num, this.wordNum);
        let result = [];
        let selectedWords = this.words.filter(word => word.count > 0)
                                      .sort((a, b) => b.count - a.count || a.id - b.id)
                                      .slice(0, count);
// 只有挑选到的单词才需要将学习的次数减一
        for (let word of selectedWords) {
            word.count--;
            result.push(word.id);
        }
        return result;
    }

reset(indexArr) {
        for (let index of indexArr) {
// 校验了一下
            if (index >= 0 && index < this.wordNum) {
                this.words[index].count = this.targetNum;
            }
        }
    }

query() {
        let count = 0;
        for (let word of this.words) {
            if (word.count > 0) {
                count++;
            }
        }
        return count;
    }
}

在这个实现中,WordLearningSys 类有三个属性,wordNum 表示单词数量,targetNum 表示目标学习次数,words 是一个单词数组,其中每个单词对象包含 idcount 两个属性,分别表示单词的序号和剩余学习次数。

learn(num) 方法接受一个数字 num,表示需要学习的单词数量。在方法内部,我们首先计算实际需要学习的单词数量 count,然后使用 filter() 方法过滤出剩余学习次数大于零的单词,并使用 sort() 方法按照学习次数和序号进行排序,然后使用 slice() 方法选择前 count 个单词。学习后,我们将所选单词的剩余学习次数减一,并将单词的序号添加到 result 数组中,最后返回 result 数组。

reset() 方法接收一个序号数组 indexArr,表示需要重置学习次数的单词的序号。在方法内部,我们使用 for...of 循环遍历 indexArr 数组中的每个序号,检查序号是否在有效范围内,然后将对应单词的剩余学习次数重置为目标学习次数。

query() 方法用于查询还剩下多少个单词需要学习。在方法内部,我们使用 for...of 循环遍历所有单词,统计剩余学习次数大于零的单词的数量,并将其返回。

涉及的知识点

对对象数组进行排序,先按照年龄从大到小进行排序,如果年龄一样则按照名字的字典序进行排序。

let arr = [
    { name: "Alice", age: 22 },
    { name: "Bob", age: 21 },
    { name: "Charlie", age: 22 },
    { name: "David", age: 20 }
];

arr.sort((a, b) => (b.age - a.age)||a.name.localeCompare(b.name)
);
let arr = [
    { name: "Alice", age: 22 },
    { name: "Bob", age: 21 },
    { name: "Charlie", age: 22 },
    { name: "David", age: 20 }
];

arr.sort((a, b) => 
{
    if (a.age !== b.age) {
        return b.age - a.age;
    } else {
        return a.name.localeCompare(b.name);
    }

}
);

console.log(arr);

例子
对对象数组进行排序

你可能感兴趣的:(#,LeetCode刻意练习,学习,前端)