每日计划-1117
1. 完成 169. 多数元素
class Solution {
public:
int majorityElement(vector<int>& nums) {
// 使用哈希表来统计每个元素出现的次数
unordered_map<int, int> countMap;
int n = nums.size();
for (int num : nums) {
// 如果元素已经在哈希表中,增加其计数
if (countMap.count(num)) {
countMap[num]++;
} else {
// 如果元素不在哈希表中,添加该元素并设置计数为1
countMap[num] = 1;
}
// 如果当前元素的计数超过数组大小的一半,返回该元素
if (countMap[num] > n / 2) {
return num;
}
}
// 按照题目假设,这里应该不会执行到,因为一定存在多数元素
return -1;
}
};
2. 八股部分
1) 什么是 C++ 内联函数?它的作用是什么?
- 定义:C++ 内联函数(inline function)是一种在编译阶段将函数体插入到调用点的函数。简单来说,编译器会将内联函数的代码在每个调用该函数的地方展开,而不是像普通函数那样进行常规的函数调用(包括保存现场、跳转到函数地址、返回等操作)。
- 作用:
- 提高性能:对于一些简单的、频繁调用的函数,使用内联函数可以减少函数调用的开销。因为函数调用涉及到一些额外的操作,如栈帧的创建和销毁、参数的传递和返回值的处理等。将函数内联后,这些开销就可以避免,从而提高程序的执行效率。例如,一个简单的获取两个整数最大值的函数,如果频繁调用,将其设为内联函数可以提升性能。
- 代码可读性:内联函数可以让代码结构更清晰。它在逻辑上是一个函数,但在性能上又接近直接将代码写在调用处。这使得代码在保持函数的模块化和可读性的同时,还能获得较好的性能。
2) 内联函数与普通函数有什么区别?如何定义和使用内联函数?
- 与普通函数的区别:
- 调用方式:
- 普通函数:当调用普通函数时,程序会跳转到函数所在的内存地址执行函数体,执行完后再返回调用点。这个过程涉及到栈帧的创建和销毁等操作。
- 内联函数:编译器在编译阶段会将内联函数的代码直接替换到函数的调用点,就好像把函数体的内容直接写在调用的地方一样,不存在函数调用的开销。
- 代码体积与执行速度权衡:
- 普通函数:代码体积相对较小,因为函数体只存在一份。每次调用函数只是执行跳转和返回等操作。但是,对于频繁调用的小函数,函数调用的开销可能会影响性能。
- 内联函数:通过减少函数调用开销来提高执行速度,但可能会导致代码体积增大。因为如果一个内联函数在多个地方被调用,那么函数体的代码会在每个调用点都插入一份。
- 适用场景:
- 普通函数:适用于功能复杂、代码量较大或者调用频率不高的函数。比如复杂的数学计算函数或者文件操作函数等。
- 内联函数:适合那些代码简单、执行速度要求高且频繁调用的函数,如简单的访问器函数(getter 和 setter)或者简单的计算函数。
- 调用方式:
- 定义和使用内联函数:
- 定义方式:
- 可以在函数声明前加上
inline
关键字,例如:inline int add(int a, int b) { return a + b; }
。 - 也可以在函数定义时加上
inline
关键字,函数声明时可以不加。如在头文件中定义函数体时:
- 可以在函数声明前加上
- 定义方式:
// 在头文件中
inline int multiply(int x, int y) {
return x * y;
}
- 使用方式:和普通函数一样调用,例如:
int main() {
int num1 = 3, num2 = 5;
int sum = add(num1, num2);
int product = multiply(num1, num2);
// 其他代码
return 0;
}