面试题:节流和防抖以及字符串统计

1.手写节流和防抖,并说明两者的区别

节流:在一定时间间隔内只执行一次事件回调函数。当事件被触发时,如果在时间间隔内还未达到执行回调函数的条件,那么事件会被忽略,直到时间间隔过去后,才会执行回调函数。

防抖:在事件被触发后,延迟一段时间执行回调函数。如果在延迟期间内再次触发了该事件,就会重新计时,直到延迟期间没有再次触发事件,才最终执行回调函数。

// 节流
function throttle(fn, delay) {
  let timer = null;

  return function (...args) {
    if (!timer) {
      timer = setTimeout(() => {
        fn.apply(this, args);
        timer = null;
      }, delay);
    }
  };
}

// 示例使用
function handleScroll() {
  console.log('处理滚动事件');
}

window.addEventListener('scroll', throttle(handleScroll, 200));


// 防抖
function debounce(fn, delay) {
  let timer = null;
  return function (...args) {
    clearTimeout(timer);
    timer = setTimeout(() => {
      fn.apply(this, args);
    }, delay);
  };
}

// 示例使用
function handleInput() {
  console.log('执行搜索操作');
}

const searchInput = document.getElementById('search-input');
searchInput.addEventListener('input', debounce(handleInput, 300));

2.统计一个字符串中字符大小写的个数

// 统计字符串中大小写字母的个数
function countUpperLowerLetters(string) {
  let upperCount = 0;
  let lowerCount = 0;

  for (let i = 0; i < string.length; i++) {
    const char = string[i];
    if (char >= 'A' && char <= 'Z') {
      upperCount++;
    } else if (char >= 'a' && char <= 'z') {
      lowerCount++;
    }
  }

  return { upperCount, lowerCount };
}

// 示例使用
const inputString = "Hello World";
const { upperCount, lowerCount } = countUpperLowerLetters(inputString);
console.log("大写字母个数:", upperCount);
console.log("小写字母个数:", lowerCount);

3.统计字符串中出现的字母次数最少的字母 

// 给定一个字符串,统计这个字符串中出现次数最少得字母

function findLeastFrequentLetter(str) {
  const frequencies = {};

  // 统计每个字母的出现次数
  for (const char of str) {
    if (char in frequencies) {
      frequencies[char]++;
    } else {
      frequencies[char] = 1;
    }
  }

  let leastFrequentLetter = null;
  let leastFrequency = Infinity;

  // 找到出现次数最少的字母
  for (const char in frequencies) {
    if (frequencies[char] < leastFrequency) {
      leastFrequency = frequencies[char];
      leastFrequentLetter = char;
    }
  }

  return leastFrequentLetter;
}

const str = "abcaabcb";
const leastFrequent = findLeastFrequentLetter(str);
console.log(leastFrequent); // 'c'

4.介绍一下发布订阅模式 

发布-订阅模式(Publish-Subscribe Pattern)是一种软件设计模式,用于实现组件之间的解耦和消息通信。它基于一种事件系统,其中发布者(Publisher)和订阅者(Subscriber)之间不直接进行通信,而是通过一个称为消息队列(或事件总线)的中介来进行消息的传递。

在发布-订阅模式中,发布者负责发布(或发送)特定类型的事件或消息,而订阅者则订阅(或监听)感兴趣的事件或消息。当发布者发布一个事件时,消息队列将通知所有订阅了该事件的订阅者。这种模式使得发布者和订阅者之间的关系松散,它们不需要直接知道彼此的存在。

发布-订阅模式的主要组件包括:

1. 发布者(Publisher):负责发布(发送)事件或消息到消息队列中。它通常提供一个接口或方法供其他组件调用来发布事件。

2. 订阅者(Subscriber):订阅(监听)感兴趣的事件或消息。它通过订阅特定类型的事件来表明自己对该事件感兴趣,并提供相应的处理逻辑。

3. 消息队列(Message Queue):作为发布者和订阅者之间的中介,负责接收发布者发布的事件,并将事件通知给所有订阅了该事件的订阅者。

使用发布-订阅模式的好处包括:

1. 解耦:发布者和订阅者之间不直接通信,它们只需要通过消息队列进行交互,从而降低了彼此之间的依赖性。

2. 扩展性:可以方便地增加新的发布者和订阅者,而不需要修改现有的组件。

3. 松散耦合:发布者和订阅者之间的关系是松散的,它们不需要知道彼此的具体实现细节,只需关注事件的发布和订阅。

4. 灵活性:订阅者可以选择性地订阅感兴趣的事件,而不会受到其他事件的干扰。

发布-订阅模式在许多领域和框架中得到广泛应用,例如事件驱动的系统、GUI 应用程序、消息队列系统等。它提供了一种可扩展和灵活的方式来实现组件之间的通信和解耦,从而提高了系统的可维护性和可扩展性。

5.统计字符串中每个字符出现的次数 

// 统计每个字符串中出现字符的个数

function fun (string) {
    let obj = {}
    if (typeof string === 'String') return
    for (let str of string) {
        if (obj[str]) {
            obj[str] ++
        } else {
            obj[str] = 1
        }
    }

    return obj
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值