✨个人主页: 北 海
所属专栏: C/C++相关题解
操作环境: Visual Studio 2019 版本 16.11.17
题目:下面两个结构体在 #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
题目链接:WY18 统计回文
题目分析:字符串相关的题目,给定字符串 A
跟字符串 B
,统计将 B
插至 A
的任意位置,将产生多少个回文串,可以暴力求解,即将 B
分别插入 A
的每一个位置,然后判断组合字符串是否为回文;判断回文时,可以使用双指针法,即首尾移动判断
#include
#include
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
,因为两者可能会错过,导致死循环题目链接:DD1 连续最大和
题目解析:这是一道来自滴滴的笔试题,考点为简单动态规划,可以直接分析都得结论:输入值 val 与 sum 累加,如果比当前值自身还要大,就统计,否则就用 val,每次相加后,都需要更新 max
#include
#include
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 组队竞赛、删除公共字符