小厂面试常考算法题整合(一)✍🏻

引言💭

这篇文章记录了小厂常考的四道算法题,准备开始面试刷经验的uu可以看看。🫰🏻

一、实现一个函数,计算一个字符串中每个字符的出现次数

题目要求是自己实现一个算法来计算字符串中每个字符的出现次数,可以用对象或 Map 来存储字符和其出现的次数。下面是一个使用对象的方法:

rust 复制代码
function countChars(str) {
  // 创建一个空对象用于存储字符计数
  const count = {};
  
  // 使用for...of循环遍历字符串中的每个字符
  for (const char of str) {
    // 对于每个字符:
    // 如果该字符已经在count对象中存在,则获取其当前值加1
    // 如果不存在,则初始化为0再加1(使用逻辑或||的短路特性)
    count[char] = (count[char] || 0) + 1;
  }
  
  // 返回统计结果对象
  return count;
}

详细解释:

  1. count 对象:用于存储每个字符及其出现次数。对象的属性名称就是字符本身,属性值则是字符出现的次数。

  2. for...of 循环 :逐个遍历字符串中的字符,每次迭代拿到当前字符 char

  3. 更新计数

    • 使用逻辑或 (||) 来检查 count[char] 是否已存在,如果存在就将当前值加 1;如果不存在,就初始化为 0,再加 1。
  4. 返回结果:最终,返回一个对象,键是字符,值是字符的出现次数。

示例:

调用 countChars("hello") 时,输出结果是:

yaml 复制代码
{
  h: 1,
  e: 1,
  l: 2,
  o: 1
}

二、判断一个字符串是否为回文

回文是指正着读和反着读都一样的字符串。比如:"level" 和 "madam" 都是回文。

csharp 复制代码
function isPalindrome(str) {
  // 将字符串转换为数组,反转数组,再合并回字符串
  const reversed = str.split('').reverse().join('');
  
  // 比较原始字符串和反转后的字符串
  return str === reversed;
}

详细解释:

  1. 字符串分割str.split('') 将字符串转换为字符数组。例如:"hello" → ["h", "e", "l", "l", "o"]
  2. 数组反转.reverse() 方法反转数组顺序。例如 ["h", "e", "l", "l", "o"]["o", "l", "l", "e", "h"]
  3. 合并为字符串.join('') 将数组元素拼接成一个新的字符串。例如 ["o", "l", "l", "e", "h"]"olleh"
  4. 字符串比较 :通过 str === reversed 判断原始字符串和反转后的字符串是否相等。如果相等,说明是回文,返回 true,否则返回 false

示例:

  • isPalindrome("racecar") → 返回 true
  • isPalindrome("hello") → 返回 false
  • isPalindrome("madam") → 返回 true

三、两个字符串是否是字母异位词(Anagram)

字母异位词是指两个字符串包含相同的字母,只是排列顺序不同。例如:"listen" 和 "silent" 是字母异位词。

csharp 复制代码
function areAnagrams(str1, str2) {
  // 首先检查两个字符串长度是否相同
  if (str1.length !== str2.length) return false;
  
  // 将第一个字符串转换为数组,排序,再合并回字符串
  const sortedStr1 = str1.split('').sort().join('');
  
  // 对第二个字符串执行相同操作
  const sortedStr2 = str2.split('').sort().join('');
  
  // 比较排序后的两个字符串
  return sortedStr1 === sortedStr2;
}

详细解释:

  1. 长度检查 :首先判断两个字符串的长度是否相同。如果长度不同,直接返回 false,因为字母异位词必须包含相同数量的字符。

  2. 字符串排序

    • 使用 split('') 将字符串转换为数组。
    • 使用 sort() 对字符数组进行排序。
    • 使用 join('') 将排序后的数组重新拼接为字符串。
  3. 比较结果 :比较排序后的两个字符串是否相等。如果相等,则说明两个字符串是字母异位词,返回 true;否则返回 false

示例:

  • areAnagrams("listen", "silent") → 返回 true
  • areAnagrams("hello", "world") → 返回 false
  • areAnagrams("debit card", "bad credit") → 返回 false(因为有空格)

四、打印斐波那契数列

斐波那契数列是一个数列,其中每个数字是前两个数字之和,通常定义为:

  • F(0) = 0
  • F(1) = 1
  • F(n) = F(n-1) + F(n-2) (当 n > 1 时)
scss 复制代码
function fibonacci(n) {
  // 基本情况:当n为0或1时,直接返回n
  if (n <= 1) return n;
  
  // 递归情况:返回前两个斐波那契数的和
  return fibonacci(n - 1) + fibonacci(n - 2);
}

详细解释:

  1. 递归终止条件 :当 n 为 0 或 1 时,直接返回 n,这是斐波那契数列的基础定义。

    • F(0) = 0
    • F(1) = 1
  2. 递归调用 :对于 n > 1,函数会递归调用自身,分别计算 fibonacci(n-1)fibonacci(n-2),并将它们相加得到 fibonacci(n)

示例:

  • fibonacci(0) → 返回 0
  • fibonacci(1) → 返回 1
  • fibonacci(5) → 返回 5(数列为:0, 1, 1, 2, 3, 5)
  • fibonacci(10) → 返回 55

结语✒️

持续更新中......

相关推荐
沙振宇1 小时前
【Web】使用Vue3开发鸿蒙的HelloWorld!
前端·华为·harmonyos
朱剑君1 小时前
第四天——贪心算法——种花
算法·贪心算法
TextIn智能文档云平台1 小时前
PDF文档解析新突破:图表识别、公式还原、手写字体处理,让AI真正读懂复杂文档!
图像处理·人工智能·算法·自然语言处理·pdf·ocr
运维@小兵1 小时前
vue开发用户注册功能
前端·javascript·vue.js
Panesle2 小时前
HunyuanCustom:文生视频框架论文速读
人工智能·算法·音视频·文生视频
hie988942 小时前
matlab稳定求解高精度二维对流扩散方程
算法·机器学习·matlab
蓝婷儿2 小时前
前端面试每日三题 - Day 30
前端·面试·职场和发展
oMMh2 小时前
使用C# ASP.NET创建一个可以由服务端推送信息至客户端的WEB应用(2)
前端·c#·asp.net
买了一束花2 小时前
MATLAB导出和导入Excel文件表格数据并处理
人工智能·算法·matlab
一口一个橘子2 小时前
[ctfshow web入门] web69
前端·web安全·网络安全