Day5 统计回文、连续最大和

简介: Day5 统计回文、连续最大和

选择题

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) 表示默认对齐数为 4Windows 中默认为 8),其次 struct One 中成员占用空间分别为 814,因为当前对齐数为 4,所以实际占用空间为 0 1 2 3 4 5 6 7812 13 14 15 最终占用 16 字节;同理 struct Two 中各成员实际占用空间为 04 5 6 7 8 9 10 1112 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 组队竞赛、删除公共字符
目录
相关文章
|
2月前
|
算法 测试技术
LeetCode-1004. 最大连续1的个数 III
LeetCode-1004. 最大连续1的个数 III
|
2月前
|
算法 前端开发
统计定界子数组的数目
统计定界子数组的数目
28 0
|
2月前
leetcode-485:最大连续1的个数
leetcode-485:最大连续1的个数
32 0
|
2月前
|
算法 测试技术 C#
【线段树】2276. 统计区间中的整数数目
【线段树】2276. 统计区间中的整数数目
|
2月前
|
算法 测试技术 C#
LeetCode2444: 统计定界子数组的数目
LeetCode2444: 统计定界子数组的数目
|
2月前
|
算法
leetcode-128:最长连续序列
leetcode-128:最长连续序列
24 0
|
2月前
leetcode-674:最长连续递增序列
leetcode-674:最长连续递增序列
32 0
Leetcode——485. 最大连续 1 的个数
文章目录 1、题目 2、滑动窗口 3、一次遍历(官方题解)
Leetcode——485. 最大连续 1 的个数
LeetCode 485. 最大连续 1 的个数 - 暴力法
定义两个变量 thisSum 每次遍历中的最大值 maxSum 返回值,所有遍历结果中的最大值
|
存储 算法
LeetCode 128. 最长连续序列
LeetCode 128. 最长连续序列
90 0
LeetCode 128. 最长连续序列