0%

学以致用

最近工作使用了几个小skill,优化了代码,还帮团队的小伙子搞定了插入排序的功能。现在有些年轻人技术有点不足啊, 一个二分查找插入搞了快一周还没完成, 汗!!!

弱类型作为开关的妙用

程序存在多个模块,每个模块都是一个单独的库,且每个模块都存在日志的打印。 希望可以通过一个地方统一控制不同模块的日志开关。通过在main.c的强符号变量,替换各个模块内的弱符号变量,控制各个不同模块的日志打印。主函数内,通过执行不同的命令变更强符号变量的值, 动态控制不同模块的日志打印。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// module_a
__attribute__(weak) bool module_a_log_enable = false;

#define MODULE_A_LOG(...) do {\
if (module_a_log_enable) {\
logFunc(__VA_ARGS__);\
}\
}\


// module_b
__attribute__(weak) bool module_b_log_enable = false;

#define MODULE_B_LOG(...) do {\
if (module_b_log_enable) {\
logFunc(__VA_ARGS__);\
}\
}\



// main.c

bool module_a_log_enable = true;
bool module_b_log_enable = true;


二分查找与插入算法的运用

接收配置,依据id从小到大保存配置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
// return 0 exist , insert fail. 1 insert success
int insertData(int *datas, int curDataCount, int newData) {
int min = 0, max = curDataCount - 1;
int middle, i;

// find position
while (min < max) {
middle = (max - min)/2 + min;
if (datas[middle] < newData) {
min = middle + 1;
} else if (datas[middle] == newData) {
return 0;
} else {
max = middle - 1;
}
}

// insert
if (min >= curDataCount) {
datas[curDataCount] = newData;
} else {
if (datas[min] < newData) {
min++;
}

for (i = count; i > min; i--) {
datas[i] = datas[i - 1];
}
datas[min] = newData;
}

return 1;
}




穷举二维数组的排列组合

有一个二维数组 a[n][m], 0 < n, m <= 8.每行的有效元素个数不固定,且单行内的元素不重复。 要求从每一行取一个有效数字,组成一个一维数组result[n]。 计算出所有可能的组合。

算法: 使用递归, 依次选取第0,1, … n行的元素,直到第n+1行结束, 每行都有column[n]个选择方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void select(int *a[8], int rowCount, int *column, int curRow, int *output) 
{
int i;

if (curRow > rowCount - 1) {
static int resultCount = 0;

resultCount++;
printf("r\r\nesult %d: ", resultCount);
for (i = 0; i < rowCount; i++) {
printf("%d ", output[i]);
}

return;
}

for (i = 0; i < column[curRow]; i++) {
output[curRow] = a[curRow][i];
select(a, rowCount, column, curRow+1, output);
}
}

行动,才不会被动!

欢迎关注个人公众号 微信 -> 搜索 -> fishmwei,沟通交流。