数据结构和算法问题汇总(上)

本文汇总了数据结构和算法的常见问题,包括防抖和节流的实现、冒泡排序、获取字符串最后一个单词的长度、计算字符出现次数、处理重复随机数、字符串分割和进制转换等实际应用。通过这些实例,读者可以加深对数据结构和算法的理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.防抖和节流怎么实现?

防抖:触发事件后在 n 秒内函数只能执行一次,如果在 n 秒内又触发了事件,则会重新计算函数执行时间;

let _debounce = (fn, wait, context) => {
    let timer = null;
    return (...args) => {
        if (timer !== null) {
            clearTimeout(timer)
        }
        timer = setTimeout(() => {
            fn.apply(context, args)
            timer = null
        }, wait)
    }
}

 节流:一个连续触发的事件,为了降低执行频率,限制其在 n 秒中只执行一次回调函数的方式;

let _throttle = (fn, wait, context) => {
    let timer = null;
    return (...args) => {
        if (timer) {
            return;
        }
        timer = setTimeout(() => {
            fn.apply(context, args)
            timer = null
        }, wait)
    }
}

2.冒泡排序怎么实现?

冒泡排序:它是一种基础的交换排序,从序列中第一个元素开始依次对相邻的两个元素进行比较,经过多轮比较后使得元素按照升序或者降序进行排列的一种排序算法。

let list = [1, 50, 30, 88, 22, 93, 55]
function bubbleSort() {
    let temp
    for (let i = 0; i < list.length - 1; i++) {
        for (let j = 0; j < list - i - 1; j++) {
            if (list[j] > list[j + 1]) {
                temp = list[j]
                list[j] = list[j + 1]
                list[j + 1] = temp
            }
        }
    }
    return list
}

 3.获取字符串最后一个单词的长度


题目描述

计算字符串最后一个单词的长度,单词以空格隔开,字符串长度小于5000。(注:字符串末尾不以空格为结尾)

输入描述

输入一行,代表要计算的字符串,非空,长度小于5000。

输出描述

输出一个整数,表示输入字符串最后一个单词的长度。

let str = 'hello world.'

function getLastWordLen(str) {
    let _wordList = str.split(' ');
    return _wordList[_list.length - 1]
}
console.log(getLastWordLen(str))

4.计算某字符出现次数


题目描述
写出一个程序,接受一个由字母、数字和空格组成的字符串,和一个字符,然后输出输入字符串中该字符的出现次数。(不区分大小写字母)

数据范围: 1 \le n \le 1000 \1≤n≤1000 

输入描述:
第一行输入一个由字母和数字以及空格组成的字符串,第二行输入一个字符。

输出描述:
输出输入字符串中含有该字符的个数。(不区分大小写字母)

let str = 'ABCabc'

function getCharNum(str, char) {
    let _charList = str.match(new RegExp(char, 'ig')) || [];
    return _charList.length;
}
console.log(getCharNum(str, 'a'))

5.明明的随机数

描述
明明生成了NN个1到500之间的随机整数。请你删去其中重复的数字,即相同的数字只保留一个,把其余相同的数去掉,然后再把这些数从小到大排序,按照排好的顺序输出。

数据范围: 1 \le n \le 1000 \1≤n≤1000  ,输入的数字大小满足 1 \le val \le 500 \1≤val≤500 

输入描述
第一行先输入随机整数的个数 N 。 接下来的 N 行每行输入一个整数,代表明明生成的随机数。 具体格式可以参考下面的"示例"。

输出描述
输出多行,表示输入数据处理后的结果

//牛客网 javascript V8 
function fn() {
  const genNumCount = readline();
  let numSet = new Set();
  for (let i = 0; i < genNumCount; i++) {
    numSet.add(readline());
  }
  let numList = new Array(...numSet);
  return numList
    .sort((prev, next) => {
      return prev - next;
    })
    .join("\n");
}

print(fn());

6.字符串分割

描述
•输入一个字符串,请按长度为8拆分每个输入字符串并进行输出;

•长度不是8整数倍的字符串请在后面补数字0,空字符串不处理。


输入描述:
连续输入字符串(每个字符串长度小于等于100)

输出描述:
依次输出所有分割后的长度为8的新字符串

//牛客网 javascript V8 
let line;
while ((line = readline())) {
  if (line === "") {
    continue;
  }
  const _extraNumber = line.length % 8;
  const result = line.concat(
    new String("0").repeat(_extraNumber ? 8 - _extraNumber : 0)
  );
  for (let i = 0; i < result.length; ) {
    print(result.substring(i, (i += 8)))
  }
}

7.进制转换

描述
•输入一个字符串,请按长度为8拆分每个输入字符串并进行输出;

•长度不是8整数倍的字符串请在后面补数字0,空字符串不处理。


输入描述:
连续输入字符串(每个字符串长度小于等于100)

输出描述:
依次输出所有分割后的长度为8的新字符串

let line;
while (line = readline()) {
  print(parseInt(line, 16));
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值