选择题
1.C指针/链表/结构
题目:下面两个结构体在 #pragma pack(4)
和 #pragma pack(8)
的情况下,结构体的大小分别是()
struct One { double d; char c; int i; }; struct Two { char c; double d; int i; };
选项:
- A. 16 24 16 24
- B. 16 20 16 20
- C. 16 16 16 24
- D. 16 16 24 24
题目分析:考的是 结构体内存对齐 相关知识,首先 #pragma pack(4)
表示默认对齐数为 4
(Windows
中默认为 8
),其次 struct One
中成员占用空间分别为 8
、1
、4
,因为当前对齐数为 4
,所以实际占用空间为 0 1 2 3 4 5 6 7
、8
、12 13 14 15
最终占用 16
字节;同理 struct Two
中各成员实际占用空间为 0
、4 5 6 7 8 9 10 11
、12 13 14 15
最终占用 16
字节。当默认对齐数修改为 8
时,struct Two
会占用更大的空间
内存对齐相关文章:《C语言进阶——自定义类型》
注意: 当所有数据都存储完成后,还有确保当前 整个结构 所占空间为最大对齐数的整数倍,如果不足,则继续向后对齐
所以当默认对齐数为 4
时,struct One
大小为 16
字节,struct Two
大小也为 16
字节;而当默认对齐数为 8
时,struct One
大小为 16
字节,struct Two
大小为 24
字节
结果:
C
编程题
1.统计回文
题目链接:WY18 统计回文
题目分析:字符串相关的题目,给定字符串 A
跟字符串 B
,统计将 B
插至 A
的任意位置,将产生多少个回文串,可以暴力求解,即将 B
分别插入 A
的每一个位置,然后判断组合字符串是否为回文;判断回文时,可以使用双指针法,即首尾移动判断
#include <iostream> #include <string> using namespace std; bool isPali(const string& str) { int left = 0; int right = str.size() - 1; while (left < right) { if (str[left] != str[right]) return false; left++; right--; } return true; } int main() { string A, B; while (cin >> A >> B) { int cnt = 0; //B 插入 A 的 i 处 for (size_t i = 0; i <= A.size(); i++) { string tmp(A); //临时字符串 tmp.insert(i, B); if (isPali(tmp)) cnt++; } cout << cnt << endl; } }
注意:
B
可以插入A
的末尾,所以注意不要遗漏这种情况- 双指针在进行判断时,不要写成
left != right
,因为两者可能会错过,导致死循环
2.连续最大和
题目链接:DD1 连续最大和
题目解析:这是一道来自滴滴的笔试题,考点为简单动态规划,可以直接分析都得结论:输入值 val 与 sum 累加,如果比当前值自身还要大,就统计,否则就用 val,每次相加后,都需要更新 max
#include <climits> #include <iostream> using namespace std; int main() { int n = 0; cin >> n; //元素数 int max = INT_MIN; //注意:最大值初始化为最小值 int sum = 0; while(n--) { int val; cin >> val; //如果加上当前数,比当前值还要小,则放弃原有累加,重新累加计算 int tmp = sum + val; if(tmp < val) sum = val; //重新开始累加计算 else sum += val; //保持原有累加 //每次都需要进行状态更新 if(sum > max) max = sum; } cout << max << endl; return 0; }
注意:最大值可以设为最小值 INT_MIN
相关文章推荐
Day4 计算糖果、进制转换
Day3 字符串中找出连续最长的数字串、数组中出现次数超过一半的数字
Day2 排序子序列、倒置字符串
Day1 组队竞赛、删除公共字符