Problem List
Problem List
1. int to string
int num;
string snum(num); // error
不存在string(int) 构造函数
sol 1
int num;
char buffer[256];
string snum(itoa(num,buffer,10));
sol 2
int num;
char buffer[256];
sprintf(buffer,"%d",num);
string snum(buffer);
2. 内存池
如何构建内存池
- 构建一个用于保存BLOCK信息的数组管理内存。BLOCK信息定义如下:
// 结构定义
enum BLOCK_USAGE
{
BLOCK_UNUSED = 0,
BLOCK_USED
};
struct BLOCK_STATE
{
BLOCK_USAGE usage;
int usage_gap;
bool bfront;
};
- 分配时首先查找第一个大小正好等于请求的BLOCK区,如果找不到则将查找BLOCK范围加1。
3. 避免悬空指针
在内存释放后不要忘记将指针置空。
delete[] ptr;
ptr = NULL;
4. void指针如何++
- 不能直接对void指令类型进行加减运算,正确的计算方式:
void* ptr;
ptr = (void*)((int)prt +1);
5. bitset
- bitset中index 0 存储数据最低位;
- 用string初始化bitset时,注意string表示“11100”形式;
- bitset中数据存储顺序与string表示数据是相反的;
- bitset要配合位运算灵活使用;
- bitset位运算时不要考虑bitset中位的存储形式,只考虑数据位运算;
- bitset提供to_string,to_ulong 转换接口。
6. 二分查找
// 递归二分查找
int GetNumber(int*num, num_len,int k, int left_index, int right_index){
// 0. 递归出口
if(left_index < right_index){
return -1;
}
// 1. 求中值
int mid_index = left_index + (right_index - left_index)/2;
int mid_value = num[mid_index];
// 2. 中值比较、更新左右查找边界
if(k == mid_value){
return mid_index;
}
else
if(mid_value > k){
right_index = mid_index - 1;
}
else{
left_index = mid_index + 1;
}
return GetNumber(num, num_len, k, left_index, right_index);
}
前提数组是排序的;
注意在更新 right_index/left_index时 添加+/- 1的增量,否则可能造成死循环。
7.异或
- 应用 : 利用异或判断两个数是否相同。
- 简称 :xor
- 符号 : ^