本文将详细讲解几个常见的 JavaScript 算法题目,包括字符统计、URL 参数解析和数组的冒泡排序,计算字符串不重复子串的最长长度,帮助大家更好地准备面试笔试题。
1. 计算字符串中单个字母出现最多的次数
题目描述:给定一个字符串,要求计算字符串中出现次数最多的字母及其次数。
解题思路: 我们可以使用对象存储每个字母出现的次数。通过循环遍历字符串,将每个字母作为对象的属性名,每次该字母出现时,累加其对应的值。同时,维护一个最大次数的变量,以便记录最大值。
// 计算字符串中单个字母出现最多的次数
function getMaxNum(s) {
let countObj = {}; // 用于存储每个字母出现的次数
let maxNum = 0; // 存储字母出现的最大次数
for (let val of s) {
if (/[a-zA-Z]/.test(val)) { // 检查是否是字母
val = val.toLowerCase(); // 统一转换为小写
countObj[val] = (countObj[val] || 0) + 1; // 字母出现一次就加一
if (countObj[val] > maxNum) { // 如果当前字母的出现次数大于最大值,更新最大值
maxNum = countObj[val];
}
}
}
return maxNum; // 返回最大值
}
let str = 'uyrdfdsghgwe';
console.log(getMaxNum(str)); // 输出:2
2. 查询 URL 地址参数并匹配参数
题目描述:从 URL 地址中解析参数,模拟通过接口获取参数并进行渲染展示。
解题思路: 我们可以使用 URLSearchParams
对象轻松地解析 URL 中的查询参数,然后通过模拟接口请求获取数据并渲染展示。
<button id="btn" onclick="serachParam()">查询</button>
<div id="content"></div>
<script>
const btn = document.getElementById('btn');
const content = document.getElementById('content');
function serachParam() {
function getParam(key) {
let param = new URLSearchParams(window.location.search); // 解析 URL 参数
return param.get(key) || ''; // 获取指定 key 的参数值
}
getData(function (result) {
try {
if (result?.data[0]?.text) {
btn.innerText = '查询成功'; // 更新按钮状态
content.innerText = result.data[0].text + getParam('text'); // 渲染获取到的数据
}
} catch (error) {
console.log(error); // 捕获并输出错误
}
});
// 模拟从接口获取数据
function getData(callback) {
setTimeout(() => {
const result = { data: [{ text: '请求参数:' }] };
callback(result);
}, 500);
}
}
</script>
3. 数组的冒泡排序
题目描述:使用冒泡排序算法对数组进行排序。
解题思路: 冒泡排序通过双重循环比较相邻元素,如果顺序错误就交换它们的位置。经过多次迭代,最大的元素会“冒泡”到数组的最后。
// 冒泡排序算法
function sortHandle(arr) {
const len = arr.length;
for (let i = 0; i < len - 1; i++) {
for (let j = 0; j < len - 1 - i; j++) { // 每次内层循环减少一位
if (arr[j] > arr[j + 1]) { // 如果前一个元素大于后一个元素,交换位置
let temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
return arr; // 返回排序后的数组
}
let arr = [4, 2, 6, 4, 1, 7];
console.log(sortHandle(arr)); // 输出:[1, 2, 4, 4, 6, 7]
4. 计算字符串中不重复子串的最长长度(滑动窗口算法)
题目描述:给定一个字符串,要求找出其中不包含重复字符的最长子串长度。
解题思路: 使用滑动窗口算法维护一个窗口来跟踪不重复的子串。通过左右指针动态调整窗口的大小。当窗口内出现重复字符时,移动左指针缩小窗口,直到窗口内不再有重复字符。
// 计算字符串中不重复子串的最长长度
function getMaxLen(s) {
let maxLen = 0; // 存储最长子串的长度
let start = 0; // 窗口的起始位置
let end = 0; // 窗口的结束位置
const setData = new Set(); // 使用 Set 来存储窗口中的字符
while (end < s.length) {
if (!setData.has(s[end])) { // 如果窗口内没有该字符
setData.add(s[end]); // 将该字符加入窗口
end++; // 右指针向右移动
maxLen = Math.max(maxLen, end - start); // 更新最大长度
} else {
setData.delete(s[start]); // 移除左指针指向的字符
start++; // 左指针右移,缩小窗口
}
}
return maxLen; // 返回最长不重复子串的长度
}
let str = 'abcabcbb';
console.log(getMaxLen(str)); // 输出:3 (最长子串为 "abc")
总结:
以上题目都是 JavaScript 中常见的算法题,涵盖了字符串操作、数组排序、URL 参数解析等内容,面试时可以重点掌握这些算法背后的思路与技巧。