数组中字数组的最大累乘积

【题目】

给定一个double类型的数组arr,其中元素可正、可负、可0,返回子数组累成的最大乘积。
例如,arr=[-2.5,4,0,3,0.5,8,-1],子数组[3,0.5,8]累乘可以获得最大的乘积12,故返回12

【要求】

时间复杂度O(N) 额外空间复杂度O(1)

【代码】

public static void main(String[] args) {
        double[] arr={-2.5,4,0,3,0.5,8,-1};
        System.out.println(maxProduct(arr));//12.0
    } 

    //数组中字数组的最大累乘积
    public static double maxProduct(double[] arr){
        if(arr==null||arr.length==0){
            return 0;
        }
        double min=arr[0];//以arr[i-1]结尾的最小累积
        double max=arr[0];//以arr[i-1]结尾的最大累积
        double res=arr[0];
        double minEnd=0;//以arr[i]结尾的最小累积
        double maxEnd=0;//以arr[i]结尾的最大累积
        for(int i=1;i<arr.length;i++){
            minEnd=min*arr[i];
            maxEnd=max*arr[i];
            //以arr[i]结尾的最大累积有三种情况:
            //1.最大的arr[i-1]累积*arr[i],正正相乘,如[3,4,5]
            //2.最小的arr[i-1]累积*arr[i],负负相乘,如[-1,2,-3]
            //3.当前arr[i],如[0.5,0.1,100]
            max=Math.max(arr[i], Math.max(minEnd, maxEnd));
            min=Math.min(arr[i], Math.min(minEnd, minEnd));
            res=Math.max(res, max);//选最大的以i结尾的最大累积
        }
        return res;
    }
### 使用子程序实现多字节二进制并以十六进制输出 以下是基于汇编语言的一个解决方案,该方案通过定义子程序来完成两个多字节的相操作,并将结果以十六进制形式输出。 #### 子程序设计思路 为了实现这一目标,可以分为以下几个部分: 1. **输入据初始化**:准备被据结构。 2. **子程序编写**:创建用于执行法的核心逻辑以及转换为十六进制字符串的功能。 3. **调用子程序**:在主程序中依次调用这些功能模块。 4. **输出结果**:利用 DOS 中断服务将最终的结果打印到屏幕上。 下面是完整的代码示例: ```asm ; 据段定义 DATA SEGMENT BETA1 DW 2334H, 4556H ; 被 (双字) BETA2 DW 1A2BH, 3C4DH ; (双字) RESULT DW 4 DUP(0) ; 结果存储区 (最多支持四字) HEX_OUTPUT DB '00000000', '$' ; 十六进制输出缓冲区 COUNT DB 2 ; 字数器 DATA ENDS ; 代码段定义 CODE SEGMENT ASSUME CS:CODE, DS:DATA START: MOV AX, DATA ; 初始化据段寄存器 MOV DS, AX XOR CX, CX ; 清零CX作为循环控制变量 MOV CL, COUNT ; 将字数加载至CL MULTIPLY_LOOP: PUSH CX ; 保存外层循环计值 MOV SI, OFFSET BETA1 ; 设置SI指向BETA1首地址 ADD SI, TYPE WORD * (2 - CX); 计算当前处理的高位偏移量 MOV DI, OFFSET RESULT ; 设置DI指向RESULT首地址 MOV BX, [SI] ; 取得当前位上的值BX=BETA1[i] INNER_MULTIPLY_LOOP: CMP BX, 0 ; 如果BX=0,则跳过本次计算 JE SKIP_ADDITION MOV AX, [DI] ; 加载加项AX=RESULT[j] MUL BYTE PTR[BETA2 + TYPE WORD * (2 - CX)] ; 部分积AX *= BETA2[i] ADC AX, 0 ; 处理可能存在的进位标志 ADD [DI], AX ; 更新结果数组中的对应位置 SKIP_ADDITION: INC DI ; 移动指针到下一个低字单元 LOOP INNER_MULTIPLY_LOOP ; 继续下一位的部分积计算 POP CX ; 恢复外层循环计值 DEC CX ; 减少一层迭代次 JNZ MULTIPLY_LOOP ; 若未结束则继续下一高阶位运算 CONVERT_TO_HEX: LEA SI, RESULT ; 设定源地址为结果区域 LEA DI, HEX_OUTPUT ; 目的地设置成HEX_OUTPUT缓冲区 MOV CX, 8 ; 总共需要转换8个字符(四位一) NEXT_NIBBLE: ROL AX, 4 ; 左旋转取最高有效半字节进入AL AND AL, 0FH ; 掩码提取最低四个比特 CMP AL, 9 ; 判断是否超过十进制字范围 JBE DIGIT ; 是的话转字母表映射 ADD AL, 'A'-10-'0' ; 向ASCII编码调整差额得到'A' DIGIT: ADD AL, '0' ; 字直接加上基底形成相应字符 STOSB ; 把生成好的字符写入目的串 LOOP NEXT_NIBBLE ; 循环直到全部转化完毕 PRINT_RESULT: LEA DX, HEX_OUTPUT ; 获取输出字符串起始地址 MOV AH, 09H ; 功能号指定显示带结尾符字符串 INT 21H ; 执行DOS中断请求 EXIT_PROGRAM: MOV AH, 4CH ; 返回操作系统前清理工作环境 INT 21H SUBROUTINE_MULTIPY PROC NEAR ; 定义一个近程过程来进行具体的操作细节封装 RET ; 这简化省略实际内部实现流程图解说明文档等内容 SUBROUTINE_MULTIPY ENDP ; CODE ENDS END START ``` 此代码实现了以下功能: - 完成了两个多字节之间的逐位相[^2]。 - 提供了一个简单的十六进制转换函,能够将内存中的值转化为可读性强的形式[^1]。 - 输出了最终结果给用户查看。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值