引言💭
这篇文章记录了小厂常考的四道算法题,准备开始面试刷经验的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;
}
详细解释:
-
count
对象:用于存储每个字符及其出现次数。对象的属性名称就是字符本身,属性值则是字符出现的次数。 -
for...of
循环 :逐个遍历字符串中的字符,每次迭代拿到当前字符char
。 -
更新计数:
- 使用逻辑或 (
||
) 来检查count[char]
是否已存在,如果存在就将当前值加 1;如果不存在,就初始化为0
,再加 1。
- 使用逻辑或 (
-
返回结果:最终,返回一个对象,键是字符,值是字符的出现次数。
示例:
调用 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;
}
详细解释:
- 字符串分割 :
str.split('')
将字符串转换为字符数组。例如:"hello" →["h", "e", "l", "l", "o"]
。 - 数组反转 :
.reverse()
方法反转数组顺序。例如["h", "e", "l", "l", "o"]
→["o", "l", "l", "e", "h"]
。 - 合并为字符串 :
.join('')
将数组元素拼接成一个新的字符串。例如["o", "l", "l", "e", "h"]
→"olleh"
。 - 字符串比较 :通过
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;
}
详细解释:
-
长度检查 :首先判断两个字符串的长度是否相同。如果长度不同,直接返回
false
,因为字母异位词必须包含相同数量的字符。 -
字符串排序:
- 使用
split('')
将字符串转换为数组。 - 使用
sort()
对字符数组进行排序。 - 使用
join('')
将排序后的数组重新拼接为字符串。
- 使用
-
比较结果 :比较排序后的两个字符串是否相等。如果相等,则说明两个字符串是字母异位词,返回
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);
}
详细解释:
-
递归终止条件 :当
n
为 0 或 1 时,直接返回n
,这是斐波那契数列的基础定义。- F(0) = 0
- F(1) = 1
-
递归调用 :对于
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
结语✒️
持续更新中......
