微众银行笔试-大湮灭术

Posted xccx-0824

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了微众银行笔试-大湮灭术相关的知识,希望对你有一定的参考价值。

大湮灭术

题目说明

世间充斥看正负两种能量,正能量对人体有益,而负能量对人体是有害的。已知地图上有n个排应一列的地域,每个地域的能量都不一样,可以用一个数字来代表某个地域中正负能量的数,正数代表正能量比负能量多,反之亦然。

现在大漫灭术的卷轴只剩下了两个,你可以对任何一个连续的区域使用大湮灭术,使用之后,无论该连续区域中能量有多少,都会清0。你希望天地间的正能量最多,请问船使得正能量最多为多少。(如果天地间都是正能量,不使用卷轴也是可以的)

解题思路

首先要明确一个问题,此处需要求的一个是区间的最大负能量,如果只是通过动态规划纯粹的从左向右遍历的话,得到的只是包含该位置在内的左边区间的最大负能量dp_left[]。因此为了解决这个问题,还需要从右向左再遍历一次dp_right[],分别获得基于该位置的左右区间最大负能量后,相加再减掉一份当前位置的值后(计算左右区间都用了nums[i]),便获得了区间最大负能量dp[],遍历获得区间最小值first。在获取到first之后通过判定其是否小于0来决定是否需要使用大湮灭术(将这部分区间清零),还是直接返回结果结束。

然后通过暴力方法(暂时没有想到更好的定位方法)来确定是哪一段区间的和等于first值,当tmp == first时跳出循环。将这一段的数值置0,至此第一遍大湮灭术使用。

第二次使用大湮灭术的基本流程和第一次的流程基本相同,同样要经历通过获取左右区间最大负能量,获取区间最大负能量,决定是否使用大湮灭术这几个步骤。如果是k次使用大湮灭术的话,可以将其用函数写出来,可以减少代码的复杂程度,提高可读性、复用性并便于维护debug。

具体代码

package Test;

import java.util.*;

public class test 

    public static void main(String[] args) 
        // 假定以这个数组为例代表能力
        int[] nums = -2, -2, -2, 1, -2, 3, 3, 3, 3, -2, -2, 1, -2, 3, 4;

        // 通过dp寻找左区间最大负能量
        int[] dp_left = new int[nums.length];
        // 左区间dp初始化
        dp_left[0] = nums[0];
        for (int i = 1; i < nums.length; i++) 
            dp_left[i] = Math.min(nums[i], dp_left[i - 1] + nums[i]);
        
        
        // 通过dp寻找右区间最大负能量
        int[] dp_right = new int[nums.length];
        // 右区间dp初始化
        dp_right[dp_right.length - 1] = nums[dp_right.length - 1];
        for (int i = nums.length - 2; i >= 0; i--) 
            dp_right[i] = Math.min(nums[i], dp_right[i + 1] + nums[i]);
        

        // 左右子区间相加获得该位置最小子区间,记得减去一次当前nums[i]
        int[] dp = new int[nums.length];
        int first = Integer.MAX_VALUE;
        for (int i = 0; i < nums.length; i++) 
            dp[i] = dp_left[i] + dp_right[i] - nums[i];
            first = Math.min(first, dp[i]);
            System.out.printf(dp[i] + " ");
        
        System.out.println();
        
        // 不需要使用湮灭术直接结束
        if(first > 0) 
            int sum = 0;
            for (int num : nums) 
                sum += num;
            
            System.out.println(sum);
            return;
        

        // 大湮灭术,通过暴力的手段定位区间后把区间内能力清零
        int start = 0;
        int end = 0;
        int tmp = 0;
        for (int i = 0; i < nums.length; i++) 
            for (int j = i; j < nums.length; j++) 
                tmp = 0;
                for (int t = i; t <= j; t++) 
                    tmp += nums[t];
                
                if (tmp == first) 
                    start = i;
                    end = j;
                    break;
                
            
            if (tmp == first) 
                break;
            
        

        for (int i = start; i <= end; i++) 
            nums[i] = 0;
        

        // 第二次使用湮灭术之前要将之前的变量重置
        Arrays.fill(dp_left, 0);
        int second = Integer.MAX_VALUE;
        for (int i = 1; i < nums.length; i++) 
            dp_left[i] = Math.min(nums[i], dp_left[i - 1] + nums[i]);
        

        Arrays.fill(dp_right, 0);
        dp_right[dp_right.length - 1] = nums[dp_right.length - 1];
        for (int i = nums.length - 2; i >= 0; i--) 
            dp_right[i] = Math.min(nums[i], dp_right[i + 1] + nums[i]);
        


        for (int i = 0; i < nums.length; i++) 
            dp[i] = dp_left[i] + dp_right[i] - nums[i];
            second = Math.min(second, dp[i]);
            System.out.printf(dp[i] + " ");
        
        System.out.println();

        // 判定是否需要使用第二次大湮灭术
        if (second > 0) 
            int sum = 0;
            for (int num : nums) 
                sum += num;
            
            System.out.println(sum);
            return;
        

        start = 0;
        end = 0;
        tmp = 0;
        for (int i = 0; i < nums.length; i++) 
            for (int j = i; j < nums.length; j++) 
                tmp = 0;
                for (int t = i; t <= j; t++) 
                    tmp += nums[t];
                
                if (tmp == second) 
                    start = i;
                    end = j;
                    break;
                
            
            if (tmp == second) 
                break;
            
        

        for (int i = start; i <= end; i++) 
            nums[i] = 0;
        

        int sum = 0;
        for (int num : nums) 
            sum += num;
        
        System.out.println(sum);
        return;


    


(这段代码也无从验证是不是对的了,只能说自己搞了几个样例验证了一下好像也没问题,过程有将区间最小和的dp数组打印出来)

微众银行区块链开源项目已达11项:这些全栈技术体系内的宝贝,等你来开箱



上周,微众银行在贵阳中国国际大数据产业博览会(简称数博会)上,发布基于区块链技术的多方大数据隐私计算平台WeDPR-PPC,为保障隐私计算中的数据可用性和隐私性给出创新解法。同时,由微众银行牵头研发的金融级区块链底层开源平台FISCO BCOS,亦荣获了2021数博会领先科技成果奖。这是微众银行继2018年深圳市金融科技专项奖一等奖、2019成为国家级区块链基础设施BSN中首个引入并适配的国产联盟链底层平台、2020年荣获工信部“中国优秀开源项目”之后,又一次在开源区块链领域获得重要肯定。


近年来,微众银行在联盟链基础能力、多种类功能组件、程序易用性、数据运营和版本兼容保障方面取得骄人成绩。同时,拢聚大量合作伙伴和开发者的微众银行区块链开源社区,更是提出需求的引路人、优化技术的造血者和共建生态的好朋友。从2017年牵头开源FISCO BCOS开始,微众银行一直走在拥抱开源社区的路线,自主研发全套联盟链核心技术体系并全面开源,并且实现全链路国产化。


在此过程中,数以万计的开源社区成员,积极提出项目优化建议、共创共建开源社区、反馈潜在项目诉求,并实际参与到代码开发、工具维护、文档编撰等工作中。正是在这样和谐互助而又生机盎然的开源生态中,微众银行的11个区块链开源项目,才能够如雨后春笋般逐一露头,快速生长为一片茂密的“源生态”竹林。

01
11个项目覆盖开发全流程
构建微众银行全栈区块链技术体系

微众银行区块链开源项目已达11项:这些全栈技术体系内的宝贝,等你来开箱

微众银行自2015年开始区块链技术的研发和应用实践。2017年,微众银行牵头开源金融级联盟链底层技术平台FISCO BCOS。然而,随着开源社区的逐步发展、行业应用的不断落地,在高性能、稳定、安全的底层平台的基础上,一个个针对联盟链开发痛点、易于开发者快速部署的开源项目应运而生。至今,在微众银行的“源生态”竹林中,已经在底层、中间件、应用组件的全流程开发环节中,孕育出11个开源区块链项目:

  • 夯实基础-底层平台


金融级区块链底层开源平台FISCO BCOS: 作为自主创新的区块链底层技术平台,FISCO BCOS单链TPS已超过2万,支持并行多链的平行扩展。此指标在中国信息通信研究院可信区块链严苛的性能评测中得到验证。平台还配套了众多周边组件,如运维部署工具、合约命名服务、数据归档与迁移工具、合约生命周期管理工具等,实现功能上的开箱即用。


FISCO BCOS构建了一整套安全解决方案,支持完整国密算法体系和国产服务器架构,是安全可控、软硬件协同一体的国产联盟链系统,涵括同态加密、群环签名、承诺、零知识证明等先进技术,满足金融级业务要求。

  • 多元配套-应用组件


实体身份认证与可信数据交换方案WeIdentity: 提供分布式实体身份标识及管理、可信数据交换协议等一系列的基础层与应用接口,可实现实体对象(人或物)数据的安全授权与交换。方案符合W3C DID规范的分布式多中心的身份标识协议,符合W3C VC规范的可验证数字凭证技术,具备可移植性、可扩展性、互操作性等方面的领先优势,可用于跨机构、跨网络的身份互通。


分布式事件驱动架构WeEvent: 实现了可信、可靠、高效的跨机构、跨平台事件通知机制,可同时打通应用程序、物联网、云服务和私有服务等不同平台,最终在不改变已有商业系统的开发语言、接入协议的情况下,实现跨机构、跨平台的事件通知与处理。


场景式数据隐私保护解决方案WeDPR: 融合密码算法、隐私保护算法、安全多方计算等专业领域前沿成果,为开发者提供场景式隐私保护高效解决方案。致力于解决业务数字化中隐私不“隐”、共享协作不可控等隐私保护风险痛点,在“数据可用不可见”的基础上更进一步,实现隐私数据的“可隐可现、可控可用”的5C隐私保护效果。


跨链协作平台WeCross: 致力于促进跨行业、机构和地域的跨区块链信任传递和商业合作,已支持市面上多种主流开源区块链,如 FISCO BCOS 、Hyperledger Fabric 等。它不局限于满足同构区块链平行扩展后的可信数据交换需求,还进一步探索解决异构区块链之间因底层架构、数据结构、接口协议、安全机制等多维异构性导致无法互联互通问题的有效方案。


联盟链可信预言机Truora: 作为连接联盟链和互联网的桥梁,致力于为链上链下建立安全可信的数据通道,以降低信任成本,进一步扩宽联盟链应用场景,促进联盟链生态繁荣。作为一整套中心化和多中心化技术方案的集合,用户在使用Truora时,可以根据不同的业务场景,以及对信任的要求度,进行灵活部署。


智能合约编程语言体系Liquid: 基于安全(Security)、性能(Performance)、体验(Experience)及定制能力(Customization )“SPEC”四个方面的智能合约编程语言设计规范应运而生。在安全方面,Liquid支持使用加密原语对数据进行隐匿,从而确保数据资产与逻辑安全;在性能方面,Liquid通过优化执行引擎并结合并行化等技术,让智能合约的执行效率取得长足进步;在体验方面,Liquid提供敏捷、流畅、友好的开发体验;在定制能力方面,Liquid能够在语言层提供分布式协作、跨链协同等编程模型,实现灵活可定制。

  • 拓宽边界-组件仓库


应用开发组件WeBankBlockchain-SmartDev: 它的研发初衷在于打造低代码开发的组件库,全方位助力开发者高效、敏捷地开发区块链应用。包含了一套开放、轻量的开发组件集,覆盖合约的开发、编译、应用开发等环节,开发者可根据自己的情况选择相应开发工具,提升开发效率。其包括WeBankBlockchain-SmartDev-Contract智能合约库组件、WebankBlockchain-SmartDev-SCGP(SmartContractGradlePlugin) 智能合约编译插件、WebankBlockchain-SmartDev-Scaffold区块链应用开发脚手架组件等。对开发者友好到极致的一键式应用开发脚手架、合约模板等,使区块链应用开发往“低代码”模式进发。


数据治理通用组件WeBankBlockchain-Data: 由数据仓库组件(Data-Stash)、数据导出组件(Data-Export)、数据对账组件(Data-Reconcile)三个相互独立、可插拔、可灵活组装的子组件构成。从底层数据存储层、智能合约数据解析层和应用层等多个层次入手,提供区块链数据挖掘、裁剪、扩容、可信存储、抽取、分析、审计、对账、监管等数据治理方面的关键能力,满足数据治理全流程开发场景的需求。


区块链多方协作治理组件WeBankBlockchain-Governance: 它是面向区块链的多方协作治理框架,即MCGF(Multilateral Collaborative Governance Framework)的实做基础和原子性构件,可复用、可定制,由私钥管理组件(Governance-Key)、账户治理组件(Governance-Account)、权限治理组件(Governance-Authority)、证书管理组件(Governance-Cert)等子组件构成。它们嵌入和运行在整个MCGF大框架的各部分,宛如高速行驶的汽车上的车轮、齿轮、传动组、传感器,协同助力构建治理框架和提升开发效率。

02
套餐式技术组合方案
让区块链应用开发又快又准


这些琳琅满目的开源技术项目有些聚焦于某一具体技术领域的增效与工具,有些则为解决某些行业领域的痛点提出创新解决方案。在面对现实问题时,开发者往往无法仅利用底层平台和某一个特定组件,就可以直接攻克问题。同时,丰富开源项目背后海量的代码行数和技术文档字数,对于开发者来说也是额外的学习成本。微众银行清晰地意识到,罗列整齐的技术组件们,就如同一整条超市货柜,看似丰富实则加剧了选择恐慌。


帮助开发者高效建立应用,还需要一张集成多个方案,共同满足业务中的多样需求的购物清单。让开发者直面底层平台和技术组件们,“裸写”智能合约和底层代码,在技术上虽然可行,但远非他们真正期望的开箱即用,无门槛一键式开发体验。更加无法满足区块链应用开发中,对区块链系统的易用性、应用开发速度的多元需求。


为了响应社区开发者的需求,微众银行选择开源中间件平台WeBASE这样一条从区块链底层通往应用落地的高速通道。它面向多种对象,如开发者、运营者,并根据不同的场景,包括开发、调试、部署、审计等,一站式集成了运营管理台、开发者IDE、快速部署和运维工具、数据报表和审计分析等工具,有着直观的图形化网页和移动端界面,使区块链可视化、可简易操作、可快速上手。


基于FISCO BCOS底层平台,部署WeBASE中间件平台,再加上多个可调用技术组件,微众银行为开发者提供了套餐式的区块链技术组合方案。开发者只需要遵循清单指引,就可以快速建立一个具备分布式身份管理,能够引入链外汇率等信息,同时又可以跨链互联,还能保护隐私,而且产生的数据能够维护和分析,更能治理多变协作关系的有效应用。


目前,微众银行套餐式的区块链技术组合方案,贯彻模块化、定制化、可扩展的设计观念,围绕区块链底层平台和中间件平台,各技术组件通过开放接口持续集成。整套体系采用分层松耦合的“微服务”架构,符合“云原生”规范,便于与私有化部署环境、云平台、以及开放网络的架构体系进行整合。开发者可以按需择优,基于开源代码、云平台、开放网络,选择一个或多个组件的区块链“套餐”,借助一键式应用开发脚手架,合约模板,应用市场快速构建应用,整体开发过程向“低代码”模式进发,大大加快了技术落地的步骤。


在2019、2020年两届工信部中国电子技术标准化研究院主办的中国区块链开发大赛中,微众银行牵头研发的FISCO BCOS都成为最多获奖团队使用的底层平台。在国家信息中心顶层规划的区块链服务网络BSN主办的第二次开发者大赛中,10个获奖团队更是有8个都采用了FISCO BCOS。究其原因,很大程度上是因为FISCO BCOS及配套的开源区块链技术能够支持又快又准的开发。实际上,在众多微众银行区块链举办的黑客松、高校技术大赛中,许多参赛团队从头搭建环境和设计开发,在3天内就拿出完成度极高的优秀作品。这样的速度和质量,离不开又快又准的辅助工具和套餐式的技术组合方案,可以让艰深痛苦的创新开发体验,也变得顺畅愉悦起来。

03
群智聚于社区
开源应用蓬勃发展
 
微众银行区块链开源项目已达11项:这些全栈技术体系内的宝贝,等你来开箱

社区成员积极提出需求,为应用项目指清方向;应用项目快速迭代,一一满足社区需求。这种健康的循环,让微众银行开源区块链社区汇聚了2000+企业机构、40000+开发者,并迅速发展成为最大最活跃的国产开源联盟链生态圈。在汇聚群智群力的生态影响下,数百个应用项目处于研发之中,其中超过120个已在生产环境中稳定运行。


举例来说,在2020年疫情特殊时期,微众银行运用组合式的区块链的实体身份标识及可验证数字凭证技术方案,为“粤澳健康码跨境互认”项目提供了开源技术支持,助力两地居民跨境通关,免除14天医学观察期。


此项目基于国产开源区块链底层框架FISCO BCOS研发,并采用微众银行区块链开源的实体身份标识及可信数据交换解决方案WeIdentity,将健康码相关信息转化为加密的可验证数字凭证,两地机构在后台不互联的情况下依然可以验证信息的真实有效性。截至2021年2月28日,已服务超5800万人次在粤澳两地跨境通行,对支持粤港澳大湾区经济社会恢复发挥了关键作用。


人民版权一站式版权保护管理平台基于FISCO BCOS区块链底层技术构建新闻版权联盟链,实现数字版权确权、监测、侵权取证、诉讼的全流程线上化和自动化。其通过作者姓名、登记时间、作品名称、作品核心摘要信息生成唯一对应的数字指纹DNA,再基于WeIdentity,对作者身份进行唯一标识及存证相关数据。


南京安链科技优证云区块链电子存证平台采用FISCO BCOS技术开发的通用区块链存证平台,支持多维存证,拥有完善的模块和松耦合技术架构,适合定制化扩展开发和集成。而WeIdentity技术方案,则帮助平台实现对存证数据可信共享。


中电长城网际电子元器件供应链溯源管理平台基于FISCO BCOS与区块链中间件WeBASE打造,实现各个区块链运维管理子系统,系统兼容运行于国产自主操作系统。其通过供应链管理中运用区块链、加密数据交换、数据可视化等关键技术,构建了基于分布式网络环境的供应链安全管理系统,为电子元器件综合信息上链管理分析、供应链信息回溯等供应链安全管理业务提供有效技术支撑。


随着越来越多应用的落地,可以相信的是,套餐式技术组合方案将更加受到合作伙伴和开发者的青睐,新的技术组合和应用探索方向将层出不穷。汇集11个开源区块链项目的宝箱位置已经标记清楚,就等勇士来开箱!

微众银行区块链开源项目已达11项:这些全栈技术体系内的宝贝,等你来开箱


运营账号简介:

微博:@钱皓 粉丝109w+
微信公众号:钱皓频道、元一资本粉丝共计50w+
百家号:粉丝20w+
今日头条:粉丝31w+
 
获得荣誉:
2018年微博十大影响力互联网科技大V
2017 年微博十大影响力互联网科技大V
2016 年微博十大影响力互联网科技大V
2019年腾讯广告&新榜New 10W+Club年度商业洞察者
2018年百度动态年度实力红人
2018年克劳锐最具影响力科技互联自媒体
2017年克劳锐最具影响力科技互联自媒体
2018年一点资讯首批入选清朗计划自媒体
2018年上海年度新媒体人
2019年搜狗“深度图文榜”获得者
 
KOL钱皓简介:
著名互联网分析师和意见领袖,前晨兴资本副总裁,前IDG投资经理。擅长从投资人视角观察互联网趋势,分析背后成因与前瞻趋势。全媒体覆盖于微信、微博、搜索引擎、各大科技门户、主流财经平台。覆盖近500万粉丝,深度影响投资及行业人士。合作请联系微信:angelalu2019

我们开通视频号啦
更趣味的财经解读
一分钟商学院,期待您的关注
» 上下滑动查看更多 «