【算法从零到千】【55-58】哈希位图+常见数学运算 接口


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 的所有字符是否全都不同。

cpp 复制代码
class 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)的算法解决此问题。

cpp 复制代码
class 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

cpp 复制代码
class 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) = 5
fabs(x) 浮点绝对值 fabs(-3.14) = 3.14
pow(a, b) a 的 b 次方 pow(2, 3) = 8
sqrt(x) 平方根 sqrt(16) = 4
cbrt(x) 立方根 cbrt(27) = 3
ceil(x) 向上取整 ceil(3.2) = 4
floor(x) 向下取整 floor(3.8) = 3
round(x) 四舍五入 round(3.5) = 4
trunc(x) 截断小数 trunc(3.8) = 3
log(x) 自然对数 log(e) = 1
log10(x) 以 10 为底 log10(100) = 2
log2(x) 以 2 为底 log2(8) = 3
sin/cos/tan(x) 三角函数(弧度) sin(0) = 0
min(a, b) 较小值 min(3, 5) = 3
max(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 更明确

相关推荐
空堂与归2 小时前
用户分群找不到规律?用K-Means聚类算法自动发现数据模式
算法·机器学习·kmeans·聚类
动词ing2 小时前
【C语言】自定义函数+指针入门
c语言·开发语言·算法
重生之后端学习3 小时前
283. 移动零[简单]✅
开发语言·数据结构·算法·leetcode·职场和发展
一只小小的芙厨3 小时前
基础数论总结
笔记·学习·算法
夜不会漫长5 小时前
C++入门(1)
开发语言·c++·算法
wen_zhufeng5 小时前
IndexTTS 2.5 技术报告
人工智能·算法·机器学习
大熊背6 小时前
树莓派相机自动白平衡详解(四)
算法·树莓派·白平衡·isppipeline
一米阳光86616 小时前
软考(中级)软件设计师核心笔记(9)算法——背包问题
笔记·算法·职场发展·软考·软件设计师·中级职称
晚风醉蝶6 小时前
1-11-奇偶排序-OddEvenSort
java·数据结构·算法