Cuuube / blog

blog on Mirror
1 stars 0 forks source link

记一次面试题 #77

Open Cuuube opened 6 years ago

Cuuube commented 6 years ago

记一次面试题

需求

需要写一个模块,生成N个M位的纯数字手机验证码,并且这N个字符串不能重复。

需求很简单,但还是有点陷阱的。

代码

class Creator {
    constructor () { }

    private createOne (length: number): string {
        let value = String(Math.ceil(Math.random() * Math.pow(10, length)));
        value = '0'.repeat(length) + value;
        value = value.substr(value.length - length);
        return value;
    }

    private check (length: number, times: number): void {
        if (typeof length !== 'number' || typeof times !== 'number') {
            throw new TypeError('Is not number!');
        } else if (Math.pow(10, length) < times) {
            throw new Error('Times too large!');
        }
    }

    create (length: number, times: number): string[] {
        this.check(length, times);

        let storage = new Set<string>();
        while (storage.size < times) {
            storage.add(this.createOne(length));
        }
        return [...storage];
    }
}

const run = () => {
    const LENGTH = 2;
    const TIMES = 11;

    let creator = new Creator();
    let arr = creator.create(LENGTH, TIMES);
    console.log(arr.every(val => {
        if (val.length !== LENGTH) {
            console.log(val);
        }
        return val.length === LENGTH;
    }));
    // console.log(arr);
}

run();

分析

小小需求包含以下知识点:

后记

这些代码是刚刚修正后整理过写的。

当时有点慌,写的一团糟。

连怎么从后往前切字符串都想不起来了。

并且没有实现数据合法检查。唉。

最后还问了下算法,时间复杂度空间复杂度

也没有答出来。。赶紧学学。