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

引言💭

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

结语✒️

持续更新中......

相关推荐
小刘不想改BUG6 分钟前
LeetCode 70 爬楼梯(Java)
java·算法·leetcode
蓝婷儿10 分钟前
第二章支线八 ·CSS终式:Tailwind与原子风暴
前端·css
老歌老听老掉牙15 分钟前
使用 SymPy 进行向量和矩阵的高级操作
python·线性代数·算法·矩阵·sympy
lifallen24 分钟前
Flink checkpoint
java·大数据·算法·flink
vanora111134 分钟前
Vue在线预览excel、word、ppt等格式数据。
前端·javascript·vue.js
树上有只程序猿36 分钟前
低代码不是炫技,而是回归需求的必然答案
前端
比特森林探险记38 分钟前
Go 中的 Map 与字符处理指南
c++·算法·golang
比特森林探险记40 分钟前
Go 中 map 的双值检测写法详解
java·前端·golang
溪饱鱼42 分钟前
React源码阅读-fiber核心构建原理
前端·javascript·react.js
陈随易1 小时前
Element Plus 2.10.0 重磅发布!新增Splitter组件
前端·后端·程序员