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);
}
  1. 前提数组是排序的;

  2. 注意在更新 right_index/left_index时 添加+/- 1的增量,否则可能造成死循环。

7.异或

  • 应用 : 利用异或判断两个数是否相同。
  • 简称 :xor
  • 符号 : ^
posted @ 2016-09-09 14:07  helo_blog  阅读(208)  评论(0编辑  收藏  举报