常见面试题——滑动窗口算法

按奇偶排序数组

题目理解

题目链接:按奇偶排序数组

简而言之就是把数组中所有偶数 移到前面,奇数移到后面,返回任意满足条件的数组即可。

解题思路

双指针交换

用两个指针 l (从0开始)和 r(从l+ 1 开始)遍历数组:

  • 当 r 指向的是偶数,且 l 指向的是奇数 → 交换两者
  • 当 l 指向的是偶数 → l 右移(保证l左侧都是偶数)
  • r 不断右移遍历整个数组

代码详解

cpp 复制代码
class Solution {
public:
    vector<int> sortArrayByParity(vector<int>& nums) {
        int n = nums.size();
        if (n == 1) { // 数组长度为1,直接返回
            return nums;
        }

        int l = 0; // 左指针,指向待交换的奇数位置
        int r = l + 1; // 右指针,遍历数组找偶数

        while (r < n) {
            // 右指针是偶数、左指针是奇数 → 交换
            if ((nums[r] % 2 == 0) && (nums[l] % 2 == 1)) {
                swap(nums[r], nums[l]);
            }
            // 左指针是偶数 → 右移,扩大已排序的偶数区域
            if (nums[l] % 2 == 0) {
                l++;
            }
            r++; // 右指针继续遍历
        }
        return nums;
    }
};

找到字符串中所有字母异位词

题目理解

题目链接:找到字符串中所有字母异位词

给定字符串 s 和 p ,找出 s 中所有是 p 的**字母异位词的子串,返回这些子串的起始索引。
(字母异位词:
字母相同但排列不同的字符串**)

解题思路

滑动窗口 + 哈希计数

因为只涉及小写字母,用两个长度为 26 的数组(hash1、hash2)分别统计 p 的字母频率、s 滑动窗口内的字母频率。通过维护一个count变量,记录窗口中有效匹配的字母数(即窗口中该字母的数量 ≤ p 中该字母的数量),当 count 等于 p 的长度时,说明当前窗口是 p 的异位词。

代码详解

cpp 复制代码
class Solution {
public:
    vector<int> findAnagrams(string s, string p) {
        vector<int> ret; // 存储结果的起始索引
        int hash1[26] = {0}; // 统计p的字母频率
        
        // 第一步:初始化p的字母频率数组
        for (auto ch : p) {
            hash1[ch - 'a']++;
        }

        int hash2[26] = {0}; // 统计滑动窗口内的字母频率
        int count = 0; // 记录窗口中有效匹配的字母数
        int p_len = p.size(); // p的长度,用于窗口大小控制

        // 滑动窗口:r是右指针,l是左指针
        for (int l = 0, r = 0; r < s.size(); r++) {
            char cur = s[r];
            // 右指针扩大窗口:将当前字符加入hash2
            if (++hash2[cur - 'a'] <= hash1[cur - 'a']) {
                count++; // 该字符在p中且数量未超,有效匹配数+1
            }

            // 窗口大小超过p的长度,左指针缩小窗口
            if (r - l + 1 > p_len) {
                char out = s[l++]; // 左指针右移,弹出窗口左端字符
                if (hash2[out - 'a']-- <= hash1[out - 'a']) {
                    count--; // 弹出的字符是有效匹配的,有效匹配数-1
                }
            }

            // 有效匹配数等于p的长度,说明当前窗口是异位词
            if (count == p_len) {
                ret.push_back(l); // 记录起始索引l
            }
        }
        return ret;
    }
};
相关推荐
王老师青少年编程1 分钟前
2026年信奥赛c++普及组csp-j第二轮复赛真题
c++·真题·csp·信奥赛
2601_967987376 分钟前
Python——入门级(定义功能def函数)
python·函数·可变参数·默认参数·关键字参数
武子康21 分钟前
MultiNet7 每轮都 clean,ESP32-P4 内存为什么还在掉?
人工智能·后端·agent
超级架构师1 小时前
PRAXO-CORE 2.5.0:用 conformance 和显式边界构建 Go Agent 框架
开发语言·人工智能·后端·golang·ai编程·智能体框架·praxo-core
深圳市快瞳科技有限公司1 小时前
野外鸟类AI识别落地实录:输入适配、结构化输出、去重聚合与置信度分流的工程实践
算法·计算机视觉·鸟类识别·鸟类ai识别·野外鸟类观测·林业调查
陈随易1 小时前
AI 运维服务器,安全又可靠的方法
前端·后端·程序员
时间的拾荒人1 小时前
CMake 常用命令详解:从版本声明到安装部署
c++·面试
专注仿真2 小时前
梯度提升类(XFBoost)算法详解与代码实例
开发语言·人工智能·python·算法·大模型训练·控制算法
小豆庄2 小时前
视频遮罩追踪退场后ID撞号的排查—多目标场景下的失效
opencv·算法·bug·视频·python3.11
外收内放2 小时前
Python基础语法练习题(75)
开发语言·python·学习