JavaScript 常见笔试题解析(字符统计,URL参数解析,数组冒泡排序等)

97 阅读3分钟

本文将详细讲解几个常见的 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 参数解析等内容,面试时可以重点掌握这些算法背后的思路与技巧。