首页 > 解决方案 > 练习 机器人名字练习总是超时

问题描述

运动练习:

https://exercism.org/tracks/typescript/exercises/robot-name

我的第一个实现:

export class Robot {
  private _name: string = ''
  private static _releaseNames: Set<string> = new Set<string>()

  constructor() {
    this.resetName()
  }

  public get name(): string {
    return this._name
  }

  public static releaseNames(): Set<string> {
    return Robot._releaseNames
  }

  public resetName(): void {
    let name = this.generateName()
    while (Robot._releaseNames.has(name)) {
      name = this.generateName()
    }
    Robot._releaseNames.add(name)
    this._name = name
  }

  private generateName(): string {
    const letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    const digits  = '0123456789'

    let name = ''
    for (var i = 0; i < 2; i++) {
      name += letters.charAt(Math.floor(Math.random() * letters.length))
    }
    for (var i = 0; i < 3; i++) {
      name += digits.charAt(Math.floor(Math.random() * digits.length))
    }

    return name
  }
}

当我单击“运行测试”时它总是超时,所以我以不同的方式再次实现它(我认为它更有效):

export class Robot {
  public name: string = ''
  private static _availableNames: string[] = Robot.shuffleArray(Robot.getAvailableNames())
  private static _releaseNames: string[] = []

  constructor() {
    this.resetName()
  }

  public resetName(): void {
    let name = Robot._availableNames.shift()
    if (name === undefined) {
      throw new Error('No name available')
    }
    this.name = name
    Robot._releaseNames.push(name)
  }

  public static releaseNames(): string[] {
    return Robot._releaseNames
  }

  private static getAvailableNames(): string[] {
    let names = []

    for (let c1 = 65; c1 < 91; c1++) {
      for (let c2 = 65; c2 < 91; c2++) {
        for (let num = 0; num < 1000; num++) {
          let name = String.fromCharCode(c1) + String.fromCharCode(c2) + num.toString().padStart(3, '0')
          names.push(name)
        }
      }
    }

    return names
  }

  private static shuffleArray(array: any[]): any[] {
    for (let i = array.length - 1; i > 0; i--) {
      const j = Math.floor(Math.random() * (i + 1));
      [array[i], array[j]] = [array[j], array[i]];
    }
    return array;
  }
}

但是第二个实现也超时了。

任何帮助找出他们(尤其是第二个)超时的原因都值得赞赏。

标签: typescript

解决方案


推荐阅读