刷题笔记
冷门的知识点
启发式搜索
拓扑排序
方便的函数
数组
log10(), log()
srand((unsigned)time(NULL));
copy(original.begin(), original.end(), nums.begin());
sort(nums.begin(), nums.end());
reverse(nums.begin(), nums.end());
//排序传参传引用可以省时间
sort(intervals.begin(), intervals.end(), [](auto &u, auto &v) {
return u[1] < v[1];
});
遍历数字中每一位1为1或0的所有情况
int x = 0x77, temp = x, cnt = 0;
do {
x = (x - 1) & temp;
cout << x << ' ';
cnt++;
if (x == temp)break;
} while (true);
cout<<endl << cnt;
list的erase用法(map,multimap,set,multiset类似)
//正确使用方法1
std::list<int> List;
for (auto it = List.begin(); it != List.end();) {
if (WillDelete(*it)) it = List.erase(it);
else it++;
}
//正确使用方法2
std::list<int> List;
for (auto it = List.begin(); it != List.end(); ) {
if (WillDelete(*it)) List.erase(it++);
else it++;
}
设计哈希表的取模法的素数选择
建堆
使用STL的函数
//默认建立大顶堆,使用greater<int>()参数建立小顶堆
make_heap(nums.begin(), nums.end(), greater<int>());
//将nums最后一个元素插入合适的位置
push_heap(nums.begin(), nums.end(), greater<int>());
//交换首尾元素并调整堆
pop_heap(nums.begin(), nums.end(), greater<int>());
使用实例
class MyHeap {
int len;
int* heap;
public:
MyHeap(int n) {
len = 0;
heap = new int[n + 1];//heap[0]为空位
}
int size() {
return len;
}
int top() {
return heap[1];
}
void pop() {
pop_heap(heap + 1, heap + len + 1, greater<int>());
len--;
}
void push(int val) {
heap[++len] = val;
push_heap(heap + 1, heap + len + 1, greater<int>());
}
};
手搓小顶堆实例
class MyHeapByHand {
int len;
vector<int> heap;
void adjustHead(int v) {
heap[0] = heap[v];
for (int i = v * 2; i <= len; i *= 2) {
if (i + 1 <= len && heap[i] > heap[i + 1])i++;
if (heap[i] < heap[0]) {
heap[v] = heap[i];
v = i;
}
else break;
}
heap[v] = heap[0];
}
public:
MyHeapByHand(int n) {
len = 0;
heap.resize(n + 1);
}
void push(int val) {
heap[++len] = val;
for (int v = len; v > 1; v /= 2) {
if (heap[v] < heap[v / 2])swap(heap[v], heap[v / 2]);
else break;
}
}
int pop() {
swap(heap[1], heap[len--]);
adjustHead(1);
return heap[len+1];
}
};
字符串
x = atoi(str.c_str());
int stoi( const std::string& str, std::size_t* pos = nullptr, int base = 10 );
isalnum(int ch), isdigit()
std::to_string(数字)
reverse(str.begin(), str.end());
位运算
n&(n-1)
其运算结果恰为把n的二进制位中的最低位的1变为0之后的结果。
异或运算
满足交换律a^b=b^a
、结合律(a^b)^c=a^(b^c)
,且a^a=0
。
可能犯的错误
1,注意while
与if
2,注意赋值=
与判等==