目录
第一题-选择题1
答案:16 16,16 24
思路:
结构体内存对齐规则
a.结构体成员对齐
1.第一个成员使用在对其的地址上,编译器自动识别
2.对于其余成员,该成员子结构体中的偏移量能否被min(该成员类型大小,对齐参数)整除,如果可以在对齐的地址上,如果不可以在改成员之前补充一些字节,补到偏移量刚好可以倍min整除
b.结构体整体对齐
a算完后,结构体已经有了一个大小size,然后计算能否被min(改结构体成员最大类型所占字节数,对齐参数)整除,如果可以则对齐,否则需要在结构体最后补充一些自己二,将size增加到min的最小整数倍
第二题-统计回文
思路:
1.找到合适的位置插入
2.判断是否是回文
#include<iostream>
#include<string>
using namespace std;
bool Iscricle(string str)
{
int begin = 0;
int end = str.size()-1;
while(begin < end)
{
if(str[begin] != str[end])
{
return false;
}
begin++;
end--;
}
return true;
}
int main ()
{
string str1;
string str2;
int count = 0;
getline(cin, str1);
getline(cin, str2);
//从第一个位置开始依次插入str2
for(int i = 0; i <= str1.size(); ++i)
{
//防止修改str1,用str代替
string str = str1;
str.insert(i, str2);
//每次插入的时候判断是否是回文
if(Iscricle(str))
{
count++;
}
}
cout<<count<<endl;
}
第三题-连续最大和
思路:
定义数组dp[i]以i结尾的子数组,现在用dp[i-1]+arr[i]和arr[i]比较,如果dp[i-1]的子数组加上当前arr[i]比当前arr[i]大则保留dp[i-1]+arr[i],否则保留arr[i],依次遍历,每次选出最大的保留下来
#include<iostream>
#include<vector>
using namespace std;
int Getmax(int a, int b)
{
return (a) > (b) ? (a) : (b);
}
int main ()
{
int size = 0;
cin >> size;
vector<int>num(size);
for(int i = 0; i < size; ++i)
{
cin >> num[i];
}
int sum = num[0];
int max = sum;
//依次插入
for(int i = 1; i < size; ++i)
{
//依次判断
sum = Getmax(sum + num[i], num[i]);
if(sum >= max)
{
max = sum;
}
}
cout << max << endl;
}