当前位置: 首页 > news >正文

机试备考笔记 1/31

以 Acwing 和 LeetCode Hot 100 为例,辅之各题单

2025年8月1日
小结:第一天写的老简单了(但是也收获很多),省流版,LeetCode 5题(哈希+双指针,微贪心),Acwing 2题(素数)

目录

    • LeetCode
      • 两数之和-sort排序
      • 字母异位词分组-sort排序两轮
      • 最长连续序列-哈希(思路很伪人,赞)
      • 移动零(大道至简,ez)
      • 容器盛水(微贪心,赞)
    • Acwing
      • 素数(欧拉+埃氏+最基础)

LeetCode

两数之和-sort排序

LeetCode 1. 两数之和

题干:
一个 int 无序数组,一个 int target,返回两数和为 target 的原下标

ez,sort O(nlogn) + pair + 双指针 O(n)

class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {vector<pair<int, int>> arr;for (int i = 0; i < nums.size(); ++i) {arr.push_back({nums[i], i}); // 存数值 + 原始下标}sort(arr.begin(), arr.end()); // 按数值排序int i = 0, j = arr.size() - 1;while (i < j) {int sum = arr[i].first + arr[j].first;if (sum == target) {int idx1 = arr[i].second;int idx2 = arr[j].second;return {min(idx1, idx2), max(idx1, idx2)}; // 保证从小到大} else if (sum < target) {++i;} else {--j;}}return {}; // 没找到}
};

字母异位词分组-sort排序两轮

49. 字母异位词分组

题干
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。

思路:两个 sort,先对要插入的字符 sort 排好,然后把 sort 前和后的,分别组成 pair 的后和前;然后对 这堆一组组的 pair 排序;遍历,pair first 不一样的时候就是要分的时候

#include <iostream>
#include <vector>
#include <algorithm>using namespace std;int main() {vector<pair<string, string>> strs;string tmp, TMP;while(cin >> tmp) {TMP = tmp;sort(tmp.begin(), tmp.end());strs.push_back({tmp, TMP});}sort(strs.begin(), strs.end());for (int i = 0; i < strs.size(); i++) cout << "[" << strs[i].first << ", " << strs[i].second << "]  ";cout << endl;int base = 0;cout << strs[base].second;for (int i = 1; i < strs.size(); i++) {if (strs[base].first != strs[i].first) {cout << endl << strs[i].second;base = i;} else {cout << " " << strs[i].second;}}return 0;
}

Attention:string TMP = tmp 是值拷贝,不会随着 tmp 的 sort 改变

最长连续序列-哈希(思路很伪人,赞)

128. 最长连续序列

题干:
给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
请你设计并实现时间复杂度为 O(n) 的算法解决此问题。

太聪明了,用哈希,每次要自己的下一个在序列中有没有(有点逆人脑思路,真的想不出这么“坏”的方法)
巧思:如果 num 的前一个 num-1 存在,那 num 不用往后数长度了,肯定被 num-1(甚至num -n)包含着了
附 unordered_set 用法

用法含义示例
unordered_set<int> s;创建一个空集合用来存储所有数字
s.insert(x);插入元素 x构建集合,去重
s.count(x);判断是否存在元素 x(结果为 0 或 1)判断某数是否在集合中
遍历写法:for (const int& num : s)遍历集合中所有元素注意集合无序
#include <iostream>
#include <unordered_set>using namespace std;int main() {int tmp;unordered_set<int> nums;while(cin >> tmp) {nums.insert(tmp);}int longest = 0;for(auto tmp : nums) {if (nums.count(tmp - 1) == 0) {int nowlength = 1, nownum = tmp;while(nums.count(nownum + 1)) {nownum++, nowlength++;}longest = max(longest, nowlength);}}cout << longest << endl;return 0;
}

移动零(大道至简,ez)

283. 移动零

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。

哎呀我真服了,我前面全是哈希的想法,直接迁移到这题(不知道怎么描述反正很抽象)
原来就是遍历输出非0,然后输出0填满长度

class Solution {
public:void moveZeroes(vector<int>& nums) {int idx = 0;for(auto item : nums) {if (item != 0) {nums[idx++] = item;}}while(idx < nums.size()) nums[idx++] = 0;}
};

容器盛水(微贪心,赞)

11. 盛最多水的容器

题目:一个 heights 数组记录模板长度,索引差就是水平底长度,求盛水最多

思路:
错误示范:“走一步看两步”,在每次移动左右指针时,通过考虑下一步的高度,选择更高的一侧前进,以期获得更高的水位,从而形成更大的面积。【2025年8月1日16点10分,记】想不明白为什么不对,想着如果克服越界问题会不会对,改了一会儿没改出来,刚刚看到一句话,恍然大悟 我们left++和right- -都是为了尝试取到更多的水,如果短的板不动的话,取到的水永远不会比上次多
正确思路:经典解法的核心在于每次都淘汰当前较短的一侧(看上面加粗的话就能理解了)

class Solution {
public:int maxArea(vector<int>& height) {int ans = 0, l = 0, r = height.size() - 1;while(l < r) {ans = max(ans, (r - l) * min(height[l], height[r]));if (height[l] < height[r]) l++;else r--;//残留美妙的尝试:// if (l == height.size() - 1) {//     if ()// } else if(r == 0) {// }// if ( && height[l + 1] > height[r - 1]) l++;// else if(r > 1 && height[l + 1] > height[r - 1]) r--;// if (height[l] < height[r]) {//     l++;// } else {//     r--;// }}return ans;}
};

Acwing

素数(欧拉+埃氏+最基础)

Acwing 开始写数学专题了,先手搓个欧拉筛(还记得,太感动了
i * prime[j] < N 这个不写会不小心数组越界的,然后嘛cpp又不报错,莫名其妙就程序end了(生气

vector<int> prime;void ElurPrime(int NN) {long long N = NN + 1;bool is_prime[N];memset(is_prime, true, sizeof(is_prime));is_prime[0] = is_prime[1] = false;for(int i = 2; i < N; i++) {if (is_prime[i] == true) {prime.push_back(i);}for (int j = 0; j < prime.size() && i * prime[j] < N; j++) {is_prime[i * prime[j]] = false;if (i % prime[j] == 0) break;}}
}

埃氏筛让GPT模仿我的码风写

void EratosthenesPrime(int N) {N += 5;bool is_prime[N];memset(is_prime, true, sizeof(is_prime));is_prime[0] = is_prime[1] = false;for (int i = 2; i < N; i++) {if (is_prime[i]) {prime.push_back(i);for (int j = i * 2; j < N; j += i) {is_prime[j] = false;}}}
}

朴素的判断单个数是否是素数

bool isPrime(int N) {if (N < 2) return false;for (int i = 2; i <= N / i; i++) {if (N % i == 0) return false;}return true;
}
http://www.dtcms.com/a/310194.html

相关文章:

  • 【科普】怎么理解Modbus、TCP、UDP
  • JavaWeb笔记2-JavaScriptVueAjax
  • MATLAB的三维重建系统
  • 从 0 到 1 认识 Spring MVC:核心思想与基本用法(上)
  • CIU32L030=CW32L010 PIN=PIN免费送样,开发板
  • 【论文学习】KAG论文翻译
  • 计算机基础速通--数据结构·线性表应用
  • RA4M2_MINI驱动OLED(1)----驱动OLED
  • LangChain框架入门04:10分钟优雅接入主流大模型
  • 智能Agent场景实战指南 Day 28:Agent成本控制与商业模式
  • 常见框架漏洞
  • dify
  • SSL 剥离漏洞
  • vue2实现类似chatgpt和deepseek的AI对话流打字机效果,实现多模型同时对话
  • OpenCV-python小玩意2 摄像头预览时画线以及line的用法
  • Vue 引入字体文件YouSheBiaoTiHei
  • VMware 下 Ubuntu 操作系统下载与安装指南
  • 前沿智能推荐算法:基于多模态图神经网络的隐私保护推荐系统
  • 学习笔记:原子操作与锁以及share_ptr的c++实现
  • 调试 Rust 生成的 WebAssembly
  • OSPF综合实验报告册
  • 1 前言:什么是 CICD 为什么要学 CICD
  • vue打包后如何在本地运行?
  • sqli-labs:Less-17关卡详细解析
  • 数据结构:在链表中查找(Searching in a Linked List)
  • PyTorch分布式训练深度指南
  • Unity 打包程序在大屏上显示的问题、分辨率问题、UI适配问题、字体模糊不清问题
  • androidstudio调试apt
  • 【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 微博评论数据可视化分析-用户评论词云图实现
  • Apple基础(Xcode仨-Singxob)