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

引言💭

这篇文章记录了小厂常考的四道算法题,准备开始面试刷经验的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

结语✒️

持续更新中......

相关推荐
酱酱们的每日掘金25 分钟前
🔥 4 月精选:AICoding Cursor上新与 MCP 实战揭秘!- AI Coding 周刊第 5 期
前端·ai编程·mcp
王齐家040635 分钟前
每日一题算法——移除链表元素、反转链表
数据结构·算法·leetcode·链表
天天扭码44 分钟前
一分钟解决 | 高频面试算法题——和为 K 的子数组(前缀和)
前端·算法·面试
ChoSeitaku1 小时前
NO.97十六届蓝桥杯备战|数论板块-最大公约数和最小公倍数|欧几里得算法|秦九韶算法|小红的gcd(C++)
c++·算法·蓝桥杯
搞瓶可乐1 小时前
鸿蒙ArkUI之布局实战,线性布局(Column,Row)、弹性布局(Flex)、层叠布局(Stack),详细用法
前端·harmonyos·鸿蒙系统·arkui·弹性布局·布局实战·堆叠布局
椰萝Yerosius1 小时前
[图论]Prim
算法·图论
Yasen^o1 小时前
go-map+sync.map的底层原理
算法·哈希算法
Expecto02 小时前
PCA——主成分分析数学原理及代码
算法·机器学习
五月仲夏2 小时前
React基础知识(补充中)
前端·react.js·前端框架