1. 回文排列
面试题 01.04. 回文排列
https://leetcode.cn/problems/palindrome-permutation-lcci/
给定一个字符串,编写一个函数判定其是否为某个回文串的排列之一。
回文串是指正反两个方向都一样的单词或短语。排列是指字母的重新排列。
回文串不一定是字典当中的单词。
class Solution { public: bool canPermutePalindrome(string s) { bitset<128> bits; for (char c : s) { bits.flip(c); } return bits.none() || bits.count() == 1; } };
std::bitset完整介绍固定大小的位集合,编译期确定大小,封装了对位的高效操作。
#include <bitset> std::bitset<8> b; // 8 个位,初始全 0核心特点
特性 说明 大小 编译期固定(模板参数),不能动态改变 存储 底层用整数数组存,空间极小 索引 [0]是最低位(最右边)性能 位运算极快,支持批量操作 构造函数
bitset<8> b1; // 00000000 bitset<8> b2(42); // 00101010(从整数构造) bitset<8> b3("1010"); // 00001010(从字符串构造,左高位右低位)常用成员函数
函数 作用 b.set()全部置 1 b.set(pos)第 pos 位置 1 b.reset()全部置 0 b.reset(pos)第 pos 位置 0 b.flip()全部取反 b.flip(pos)第 pos 位取反 b.test(pos)检查第 pos 位是否为 1(返回 bool) b.any()是否存在 1 b.none()是否全为 0 b.all()是否全为 1 b.count()1 的个数 b.size()总位数 b.to_ulong()转 unsigned long b.to_string()转字符串
2. 判断字符是否唯一
面试题 01.01. 判定字符是否唯一
https://leetcode.cn/problems/is-unique-lcci/
实现一个算法,确定一个字符串
s的所有字符是否全都不同。
cppclass Solution { public: bool isUnique(string astr) { if(astr.size()>26) return false; int bitMap=0; for(auto& e:astr) { int i=e-'a'; if((bitMap>>i)&1==1) return false; bitMap|=(1<<i); } return true; } };
3. 最长连续序列
128. 最长连续序列
https://leetcode.cn/problems/longest-consecutive-sequence/
给定一个未排序的整数数组
nums,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。请你设计并实现时间复杂度为
O(n)的算法解决此问题。
cppclass Solution { public: int longestConsecutive(vector<int>& nums) { unordered_set<int> hash(nums.begin(),nums.end()); int res=0; for(auto& e:hash) { if(hash.count(e-1)) continue;//确定是不是开头,不是跳过 int y=e+1;//确定是开头后,往后遍历,查找长度 while (hash.contains(y)) {y++;} res=max(res,y-e);//最大长度统计 } return res; } };
4. 最近的可用无人机
4024. 最近的可用无人机
https://leetcode.cn/problems/nearest-available-drone/
给你一个二维整数数组
drones,其中drones[i] = [xi, yi, rangei]表示第ith架无人机的横坐标、纵坐标和飞行范围。另给你一个整数数组
target = [tx, ty],表示目标的坐标。如果无人机
drones[i]的坐标与目标坐标之间的曼哈顿距离小于或等于其rangei,则该无人机能够到达目标。返回能够到达目标且与目标之间曼哈顿距离最小的无人机的下标。如果存在多个符合条件的无人机,则返回其中最小的下标。如果没有无人机能够到达目标,则返回 -1
cppclass Solution { public: int nearestDrone(vector<vector<int>>& drones, vector<int>& target) { int res=INT_MAX; for(auto& e:drones) { int dest=abs(e[0]-target[0])+abs(e[1]-target[1]); if(dest<=e[2]) {res=min(res,dest);} } int i=0; for(auto& e:drones) { int dest=abs(e[0]-target[0])+abs(e[1]-target[1]); if(dest<=e[2]&&dest==res) return i; else i++; } return -1; } };
C++ 常用数学/算法接口
<cmath>数学函数
函数 作用 示例 abs(x)绝对值 abs(-5) = 5fabs(x)浮点绝对值 fabs(-3.14) = 3.14pow(a, b)a 的 b 次方 pow(2, 3) = 8sqrt(x)平方根 sqrt(16) = 4cbrt(x)立方根 cbrt(27) = 3ceil(x)向上取整 ceil(3.2) = 4floor(x)向下取整 floor(3.8) = 3round(x)四舍五入 round(3.5) = 4trunc(x)截断小数 trunc(3.8) = 3log(x)自然对数 log(e) = 1log10(x)以 10 为底 log10(100) = 2log2(x)以 2 为底 log2(8) = 3sin/cos/tan(x)三角函数(弧度) sin(0) = 0min(a, b)较小值 min(3, 5) = 3max(a, b)较大值 max(3, 5) = 5
<algorithm>常用算法
函数 作用 sort(begin, end)排序(默认升序) reverse(begin, end)反转 swap(a, b)交换 find(begin, end, val)查找 count(begin, end, val)计数 accumulate(begin, end, init)求和( <numeric>)lower_bound(begin, end, val)第一个 ≥ val 的位置 upper_bound(begin, end, val)第一个 > val 的位置 binary_search(begin, end, val)二分查找是否存在 unique(begin, end)去重(需先排序) fill(begin, end, val)填充 memset(ptr, val, size)内存填充( <cstring>)注意
// ❌ 坑:abs 对整数,fabs 对浮点 abs(-3.14) // 结果可能是 3(截断),取决于重载 fabs(-3.14) // 3.14,浮点专用 // ✅ C++11 后 abs 有浮点重载,但建议用 fabs 更明确

