字节的两道算法

78 阅读2分钟

问题

1、按照期望的调用方式实现Typewriter类,其中包括startstopreset方法

  // 期望的调用方式
<p id="typewriter">Hello, world!</p>
const element = document.getElementById("typewriter");
const typewriter = new Typewriter(element);

// 实现下面代码
class Typewriter {
  constructor(element, speed = 50) {
  
  }
  start() {

  }
  stop() {

  }
  reset() {

  }
}

作答

class Typewriter {
  constructor(element, speed = 50) {
    this.element = element;      // 存储传入的HTML元素
    this.text = element.textContent;  // 存储元素的文本内容
    this.speed = speed;          // 设置打字速度
    this.isStopped = true;       // 初始状态为停止
    this.currentIndex = 0;       // 当前字符的索引
  }

  start() {
    if (this.isStopped) {
      this.isStopped = false;   // 将状态设为未停止
      this.typeText();          // 调用打字方法开始效果
    }
  }

  stop() {
    this.isStopped = true;      // 停止打字效果
  }

  reset() {
    this.isStopped = true;      // 重置状态为停止
    this.currentIndex = 0;      // 重置索引
    this.element.textContent = '';  // 清空元素内容
  }

  typeText() {
    if (this.isStopped || this.currentIndex === this.text.length) {
      return;
    }

    this.element.textContent += this.text[this.currentIndex];  // 逐个字符地将文本添加到HTML元素中
    this.currentIndex++;

    setTimeout(() => this.typeText(), this.speed);  // 使用setTimeout递归调用以模拟打字效果
  }
}

const element = document.getElementById("typewriter");
const typewriter = new Typewriter(element);

// 调用方式
typewriter.start();  // 启动打字效果
// 在某个时刻可以调用 typewriter.stop() 来停止
// 在某个时刻可以调用 typewriter.reset() 来重置

2、合并整数,返回下角标

// 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target的那两个整数,并返回它们的数组下标。
// 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
// 你可以按任意顺序返回答案。

// 示例 1:
// 输入:nums = [2,7,11,15], target = 9
// 输出:[0,1]
// 解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
// 示例 2:
// 输入:nums = [3,2,4], target = 6
// 输出:[1,2]
// 示例 3:
// 输入:nums = [3,3], target = 6
// 输出:[0,1]

答案

function twoSum(nums, target) {
    // 创建一个空对象,用于存储元素和它们的索引
    const numMap = {};
    // 遍历整数数组
    for (let i = 0; i < nums.length; i++) {
        const num = nums[i];
        // 计算当前元素与目标值的差值
        const complement = target - num;
        // 检查差值是否已经在对象中,如果是,返回它们的索引
        if (complement in numMap) {
            return [numMap[complement], i];
        }
        // 如果差值不在对象中,将当前元素及其索引添加到对象
        numMap[num] = i;
    }
    // 如果没有找到答案,返回一个空数组
    return [];
}
// 示例用法
const nums1 = [2, 7, 11, 15];
const target1 = 9;
const result1 = twoSum(nums1, target1);
console.log(result1);  // 输出 [0, 1]

const nums2 = [3, 2, 4];
const target2 = 6;
const result2 = twoSum(nums2, target2);
console.log(result2);  // 输出 [1, 2]

const nums3 = [3, 3];
const target3 = 6;
const result3 = twoSum(nums3, target3);
console.log(result3);  // 输出 [0, 1]