题解来源于牛客网中网友给出的答案。
2、给定整数n,取若干个1到n的整数可求和等于整数m,编程求出所有组合的个数。比如当n=6,m=8时,有四种组合:[2,6], [3,5], [1,2,5], [1,3,4]。限定n和m小于120
对于当前n,m都有两种选择,选择n和不选择n
1 #include <bits/stdc++.h> 2 using namespace std; 3 int dfs(int n, int m) { 4 if(n < 1 || m < 1) return 0; 5 if(n > m) n = m; 6 int sum = 0; 7 if(n == m) sum ++; 8 sum += dfs(n-1,m); 9 sum += dfs(n-1,m-n); 10 return sum; 11 } 12 int main() { 13 int n, m; 14 cin >> n >> m; 15 cout << dfs(n,m) << endl; 16 return 0; 17 }
3、32位机器上,以下结构的sizeof(P)为
struct A {
int a; //4个字节
char b; //一个字节 所以后面需要加3个字节
int c; //4个字节
char d; //一个字节,后面需要加3个字节
} //16字节
struct P {
struct A w[2]; //2*16个字节
short b; //2个字节 后面需要加2个字节
struct A* p; //32位机器指针是4位的, 4个字节
} // 40个字节
1、结构体每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,如果不是,编译器会自动在成员间填充
2、当所有成员大小计算完毕后,编译器判断当前结构体大小是否是结构体中最宽的成员变量大小的整数倍 如果不是会在最后一个成员后做字节填充,可以解释最后补充的字节
4、以下哪个容器的删除操作会进行内存的移动:vector
vector是利用数组存放元素,当前面有元素被删除的时候后面的元素都向前移动一格,所以会进行内存的移动。list set map 值需要移动指针就行。
6、void test() {
int s1;
int s2;
int *s3 = (int *)malloc(4);
int *s4 = (int *)malloc(4);
}
int s1;
int s2;
int *s3 = (int *)malloc(4);
int *s4 = (int *)malloc(4);
}
以下哪个值最大 &s1、&s2、s3、s4
s1 栈空间内存地址是按高地址到低地址的。
14、
GCC:GNU Compiler Collection(GUN 编译器集合),它可以编译C、C++、JAV、Fortran、Pascal、Object-C、Ada等语言。
gcc是GCC中的GUN C Compiler(C 编译器)
g++是GCC中的GUN C++ Compiler(C++编译器)
gcc和g++的主要区别
1. 对于 *.c和*.cpp文件,gcc分别当做c和cpp文件编译(c和cpp的语法强度是不一样的)
2. 对于 *.c和*.cpp文件,g++则统一当做cpp文件编译
3. 使用g++编译文件时,g++会自动链接标准库STL,而gcc不会自动链接STL
4. gcc在编译C文件时,可使用的预定义宏是比较少的
5. gcc在编译cpp文件时/g++在编译c文件和cpp文件时(这时候gcc和g++调用的都是cpp文件的编译器),会加入一些额外的宏
20、当多个线程对某个原子数据进行读写操作时,读操作不用加锁,只用对写操作加锁即可
25、
死锁产生的四个必要条件
- 互斥条件:资源是独占的且排他使用,进程互斥使用资源,即任意时刻一个资源只能给一个进程使用,其他进程若申请一个资源,而该资源被另一进程占有时,则申请者等待直到资源被占有者释放。
- 不可剥夺条件:进程所获得的资源在未使用完毕之前,不被其他进程强行剥夺,而只能由获得该资源的进程资源释放。
- 请求和保持条件:进程每次申请它所需要的一部分资源,在申请新的资源的同时,继续占用已分配到的资源。
- 循环等待条件:在发生死锁时必然存在一个进程等待队列{P1,P2,…,Pn},其中P1等待P2占有的资源,P2等待P3占有的资源,…,Pn等待P1占有的资源,形成一个进程等待环路,环路中每一个进程所占有的资源同时被另一个申请,也就是前一个进程占有后一个进程所深情地资源。
以上给出了导致死锁的四个必要条件,只要系统发生死锁则以上四个条件至少有一个成立。事实上循环等待的成立蕴含了前三个条件的成立,似乎没有必要列出然而考虑这些条件对死锁的预防是有利的,因为可以通过破坏四个条件中的任何一个来预防死锁的发生。