最大连续数字长度

问题来源:

点击打开链接


问题描述:

Given a binary array, find the maximum number of consecutive 1s in this array.

Example 1:

Input: [1,1,0,1,1,1]
Output: 3
Explanation: The first two digits or the last three digits are consecutive 1s.
    The maximum number of consecutive 1s is 3.

Note:

  • The input array will only contain 0 and 1.
  • The length of input array is a positive integer and will not exceed 10,000

我的解决方案:

class Solution {
public:
    int findMaxConsecutiveOnes(vector<int>& nums) {
        int tmp=0,ret=0;
        for(int i=0;i<nums.size();++i)
        {
            if(nums[i]==1)
            {
              tmp++;
              ret=tmp>ret?tmp:ret;
            }
            else
             tmp=0;
        }
        return ret;
    }
};

思考:

此题的解法没啥好说的,用两个临时变量,一个来保存当前最大长度,一个来保存已知最大长度,一次遍历就能搞定,收录这个题有两个原因,一是刚开始写博客,用来养成一个记录的习惯,二是在这道题上犯了个小错误,值得反思

第一遍的解法如下:

class Solution {
public:
    int findMaxConsecutiveOnes(vector<int>& nums) {
        int tmp=0,ret=0;
        for(int i=0;i<nums.size();++i)
        {
            if(nums[i]==1)
              tmp++;
            else
            {
              if(tmp>ret)
                ret=tmp;
              tmp=0;
            }
        }
        return ret;
    }
};

乍眼一看没啥问题,run code的简单验证也是ok的,但是没有注意边界情况,假如最后一位不是0,那么ret就没有更新,很明显ret的更新应该跟tmp的增加放在一起,写代码的时候对边界情况进行测试对于快速发现问题很有帮助


<think>嗯,用户问的是Modbus协议接收数据的最大长度限制。查阅引用的modbus-rtu.c代码片段,其中提到了MODBUS_RTU_MAX_ADU_LENGTH这个关键常量,应该就是RTU模式下ADU的最大长度。从代码注释看RTU模式的ADU由地址+PDU+CRC组成。需要确认PDU部分的限制。根据Modbus协议标准,PDU本身的限制是253字节(包括1字节功能码+252字节数据),这样加上RTU头尾后的总长度是256字节。用户提到"接收数据"需要进一步澄清:可能指APDU的应用数据段(最大252字节),也可能是整个ADU帧(256字节)。RTU和TCP的ADU结构不同,但PDU长度限制一致。ASCII模式因为十六进制编码会导致长度加倍(512字节)。另外注意到用户引用的modbus_reply函数文档提到mb_mapping空间必须足够,这意味着用户实际使用时还要考虑内存分配是否满足协议上限。TCP模式额外需要7字节MBAP头,但应用数据段仍受限于PDU规范。应该把核心限制拆解说明:分协议模式解释帧结构,再指出应用数据的实际可用最大值。需要特别提醒252字节是PDU层限制,实际设备可能更小。补充这个值源自Modbus协议文档的原文引用会更有说服力。用户的问题很专业,说明ta在开发Modbus从机设备,正在处理数据缓冲区设计。ta特意提到"接收数据",可能更关心应用层有效载荷而非完整帧长度。因此回答重点放在数据字段最大值,同时说明完整帧长度供底层驱动参考。</think> 在 Modbus 协议中,接收数据(应用数据单元 PDU)的最大长度限制由协议类型决定: #### 1. **RTU 模式(串行通信)** - **最大 ADU 长度**:256 字节 - **地址字段**:1 字节(设备地址) - **PDU(协议数据单元)**:253 字节(包括功能码和应用数据) - **CRC 校验**:2 字节 - **实际可用数据长度**:**不超过 252 字节**(功能码占 1 字节,数据域最大 252 字节)。 *代码依据*:引用中的 `MODBUS_RTU_MAX_ADU_LENGTH` 常量即为 256 字节[^1]。 #### 2. **TCP 模式(以太网通信)** - **最大 ADU 长度**:260 字节 - **MBAP 头**:7 字节(事务标识符、协议标识符、长度字段等) - **PDU**:253 字节(同 RTU 模式) - **实际可用数据长度**:同样**不超过 252 字节**(受限于 PDU 容量)。 #### 3. **ASCII 模式(串行通信)** - **最大 ADU 长度**:513 字节(由于十六进制字符编码) - **实际可用数据长度**:**不超过 252 字节原始数据**(编码后长度加倍,加起始符、校验等)。 #### ⚠️ 关键约束 - PDU 的 **253 字节上限**源于 Modbus 协议标准定义(功能码 1 字节 + 数据 252 字节)[^2]。 - 功能码(如读线圈 `0x01`)本身占 1 字节,**有效负载数据最大为 252 字节**。 - 实际设备可能设置更低限制(如 PLC 厂商限制为 120 字节),需查阅具体设备手册。 #### 📌 总结 | 模式 | 最大 PDU 数据长度 | 完整 ADU 最大长度 | |-------|-------------------|------------------| | RTU | 252 字节 | 256 字节 | | TCP | 252 字节 | 260 字节 | | ASCII | 252 字节 | 513 字符 | > 示例:读寄存器请求(功能码 `0x03`)中,可请求的寄存器数量受限于数据长度。若每个寄存器值占 2 字节,最多可连续读取 **126 个寄存器**(252 ÷ 2)。 --- ### 📚 相关问题 1. **Modbus RTU 与 TCP 的帧结构差异是什么?** 2. **如何优化 Modbus 通信处理大块数据?** 3. **设备实际支持的数据长度小于协议上限时如何处理?** 4. **Modbus PDU 中功能码与数据的关系?**
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值