区块链特辑——solidity语言基础(七)

Solidity语法基础学习

十、实战项目(二):

3.项目实操:

ERC20 代币实战

①转账篇

总发行量函数

totalSupply() return(uint256)

·回传代币的发行总量

·使用状态变量uint256_totalSupply来储存

 

账户余额查询函数

Balance0f(address) returns(uint256)

·给定一个账户(address),回传该账户拥有的代币余额(uint256)

·使用mapping来储存:

  ·mapping(address => uint256) _balance;

 

转账函数

Transfer(address,uint256) returns(bool);

·呼叫者“msg.sender”,转移“amount”数量的代币给特定账户“to”

·成功时回传true,反之,回传false

·有些检查需要做:

  ·amount是否超过余额

  ·是否转移给address 0x0代表销毁的意思

 

转账事件

event Transfer(

    address indexed from,

    address indexed to,

    uint256 value,

);

·当发生代币转移时,必须触发此事件,即使转移的数量为“0”也是

 

②授权篇

授权余额查询函数

allowance(address owner,address spender) returns(uint256);

·给定两个账户(address),回传“owner”授权给“spender”的额度(uint256)

·使用mapping来储存:

  ·mapping(address =>

    ·mapping(address => uint256) _allowance;

注:mapping查询节省燃料

 

授权函数

approve(address spender,uint256 amount) returns(bool);

·呼叫者“msg.sender”,授权“amount”数量的代币额度给第三方账户“spender”

·成功时回传true,反之,回传false

 

授权事件

event Approval(

    address indexed owner,

    address indexed spender,

    uint256 value,

);

 

·当授权额度时,必须触发此事件,即使数量为“0”也要触发

 

③花别人的钱

从第三方账户转账的函数

transferFrom(address from,address to,uint256 amount);

·呼叫者(msg.sender)从代币持有者(from)转账给接收者(to)“amount”数量的代币

·其中:

  ·需检查呼叫者是否拥有足够的额度可用

  ·转账时要检查持有者是否足够的余额

  ·转账时需要同时减少额度

4.补充概念:

ERC20代币实战

元资料(metadata)

铸造(mint)与销毁(burn)篇

ERC20 Meta接口

Interface IERCMetadata{……}

interface IERC20Metadata{
    function name() public view returns(string memory);
    function symbol() public view returns(string memory);
    function decimals() public view returns(uint8); 
}

 

代币名称

function name() public view returns(string memory);

·回传一个字符,代表这个代币的名称

·储存是以string来保存

·通常在constructor的时候就给定

 

代币的简称/缩写/象征

function symbol() public view returns(string memory);

·回传一个字符串,代表这个代币的简称

  ·Ethereum(name)→ETH(symbol)

  ·Apple(name)→AAPL(symbol)

·储存时以string来保存

·通常在constructor的时候就给定

 

代币小数点位置

function decimals() public view returns(uint8);

·回传一个uint8,代表这个代币的小数点位置

·这个函数只用来显示用

  ·decimals=3,则balance=1234,在显示为1.234

·基本上代币都会把decimals设定为18

  ·这是因为最开始就是设计的18,后来因为人类天性,能抄就抄

  ·1ether=1018wei

  ·1token=1018uint => decimals=18

 

ERC20辅助函数

铸造(mint)与销毁(burn)

interface IERC20{
    function mint(address account,uin256 amount);
    function burn(address account,uint256 amount);
}

 

铸造新代币

function mint(address account,uint256 amount);

·铸造,即“无中生有”

·只有合约拥有者或者特殊权限的人才能呼叫

·他同时也是一种转账,由address 0x0转到目标账号(account)

·由于是转账,因此也要触发“Transfer”事件

 

销毁代币

function burn(address account,uint256 account);

·销毁,即“回归虚无”

·可以根据使用情况决定谁可以呼叫

  ·若只有合约拥有者可以呼叫,则通常会有account参数,用来销毁特定人的代币

  ·若任何人都可以呼叫,则不会有account参数,用来销毁特定人的代币

  ·若任何人都可以呼叫,则不会有account参数,主要目的是请求呼叫者(msg.sender)销毁自己的代币同时也是一种转账,由account/msg.sender转到address 0x0

·由于是转账,因此也要触发“Transfer”事件

 

Example:示例代码

 

//SPDX-License-Identifier:MIT
pragma solidity ^0.8.17;

interface IERC20 {
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner,address indexed spender, uint256 value);

    function totalSupply() external view returns (uint256);

    function balance0f(address account) external view returns (uint256);
    function allowance(address owner,address spender) external view returns (uint256);

    function approve(address spender, uint256 amount) external returns (bool);
    function transfer(address to, uint amount) external returns (bool);
    function trnasferFrom(address from, address to, uint256 amount) external returns (bool);
}

contract ERC20 is IERC20 {
    uint _totalSupply;//定义一个数
    mapping(address => uint256) _balance;//定义了一个账号
    mapping(address => mapping(address => uint256)) _allowance;
    //查询授权额度
    function allowance(address owner, address spender) public view returns (uint256) {
        return _allowance[owner][spender];//返回自己和第三方
    }

    function _approve(address owner, address spender, uint256 amount) internal {
        _allowance[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    //授权
    function approve(address spender, uint256 amount) public returns (bool) {
        _approve(msg.sender, spender, amount);
        return true;
    }

    //发行代币,启动最初代币
    constructor () {
        _balance[msg.sender] = 10000;
        _totalSupply = 10000;
    }

    function totalSupply() public view returns (uint256) {
        //回传总发行量
        return _totalSupply;
    }

    function balance0f(address account) public view returns (uint256) {
        //回传查询余额
        return _balance[account];
    }

    function _transfer(address from, address to, uint256 amount) internal {
        uint256 myBalance = _balance[from];
        require(myBalance >= amount,"No money to transfer!");//已经没钱转账了
        require(to != address(0),"Transfer to address 0");//不准转账到地址0
        _balance[from] = myBalance - amount;//我的账户总额计算
        _balance[to] = _balance[to] + amount;//你的账户怎么计算
        emit Transfer(from, to, amount);
    }
    
    //实现转账功能
    function transfer(address to, uint256 amount) public returns (bool) {
        _transfer(msg.sender, to , amount);
        return true;
    }

    //检查额度花人家的钱
    function trnasferFrom(address from, address to, uint256 amount) external returns (bool) {
        uint256 myAllowance = _allowance[from] [msg.sender]; 
        require(myAllowance >= amount,"ERROR:myAllowance < amount"); //我们允许的额度是否小于了他花的额度

        _approve(from, msg.sender, myAllowance - amount);//花去以后是否允许的额度有减少
        _transfer(from, to, amount);
        //检查花销是否从原来账户转移到被授权者账户
        return true;
    }
}

 

 

 

本文转载于网络 如有侵权请联系删除

相关文章

  • 中国 AI 市场格局:(计算机视觉:商汤、旷视、海康)(语音语义:讯飞、阿里、百度)(机器学习平台:第四范式、华为云、九章云极)

    2022年6月20日,IDC发布的《2021年中国人工智能软件及应用市场研究报告》显示:2021年全年中国人工智能软件及应用市场规模达52.8亿美元(约330.3亿元人民币),相比2020年涨幅为43.1%。相比去年同期预测值,涨幅略为降低,疫情的影响明显,以及行业端对AI投资日趋理性谨慎。无论是中国市场还是美国市场,近几年来,主流厂商的市场格局一直在不断演变,远没有达到格局稳定、几家公司形成垄断的阶段。在未来,技术创新型企业仍有可能胜出。计算机视觉市场格局其中计算机视觉市场2021H2相比2020H2增长47.0%,市场规模达13.5亿美元,全年实现23.4亿美元的市场规模。市场增长驱动力来源于工业质检、预测性维护场景,以及疫情防控带来的分散的视觉相关应用场景。语音语义市场格局语音语义市场2021H2相比2020H2增长37.0%,市场规模达12.3亿美元,全年实现21.7亿美元的市场规模。市场增长驱动力来源于NLP技术的成熟以及相关应用场景的增长,智能语音以及对话式AI子市场均已进入缓慢增长期。机器学习平台市场格局机器学习平台市场2021H2相比2020H2增长37.0%,市场规模

  • MHV 演讲两则

    来源:Mile-HighVideoDay1 演讲1:KEYNOTE:JaimeMiles 主讲人:JaimeMiles,VPVideoInfrastructure(VIPER) 演讲2:DeliveringtheMetaverseusingErasureCodes 主讲人:MichaelLuby,BitRipple公司CEO 内容整理:王炅昊 两则来自Mile-HighVideo峰会的演讲,前者介绍了他对视频编码传输系统未来的展望,后者则讲述了纠删码(ErasureCodes)技术,以及其在元宇宙内容传输中的应用。目录keynote:JaimeMiles工作流程具体操作使用纠删码实现元宇宙内容传输挑战纠删码技术(ErasureCodes)keynote:JaimeMilesJaimeMiles来自VIPER,他们的团队构建了一个完整的从视频内容获取、处理、存储、传输和播放5个部分,如下图所示:视频处理pipeline而本次视频的主要部分,他从工作流程和具体操作两个方面,分别介绍了从他的角度,我们产业需要做的一些改变。工作流程使用方便(PlugandPlay)Jaime说到,当前的系统虽

  • 【RAC】如何修改SCAN IP的IP地址、名称、端口等信息

    今天小麦苗给大家分享的是如何修改SCANIP的IP地址、名称、端口等信息。【RAC】如何修改SCANIP的IP地址、名称、端口等信息HowtoUpdatetheIPAddressoftheSCANVIPResources(ora.scan{n}.vip)(文档ID952903.1)InthisDocumentGoalSolutionReferencesAPPLIESTO:OracleDatabase-EnterpriseEdition-Version11.2.0.1andlater Informationinthisdocumentappliestoanyplatform. GOALThepurposeofthisdocumentistoexplainhowtochangetheIPaddressesassociatedwiththeSCANVIPsina11gR2Grid(CRS)environment. TheIPaddressesassociatedwiththeSCANVIPresourcesareinitiallysetwhentheSCANresourcesarecrea

  • 从业十余年的资深数据大咖告诉你,该如何做好数字时代的大客户管理?

    图丨壹看板创始人兼CEO赵乾坤【数据猿导读】如果从市场和销售的角度来说的话,提升效率的工作流程信息化、移动化、智能化的工具类软件,以及对效果负责的软件和服务是必不可少的利器;但更重要的是要善用这些工具,学会拆解大客户管理的本质和核心目标,还要能留出更多的时间来思考做好核心任务的策略作者|赵乾坤官网|www.datayuan.cn微信公众号ID|datayuancn所谓大客户管理是指某一类特殊的企业,大客户是他们服务的对象。这类企业不是按照消费者的类型来划分的,比如2B还是2C的模式,而是从服务对象的单次消费金额来区分。大客户是指企业服务类和高单价个人服务类企业的一个抽象概念。这类企业有这么几个特点:1、针对这类型的企业,每个客户线索都是非常珍贵的,不单单是获客成本很高,其决策过程中的转化流程复杂(虽然我们支持各种电子支付),各层转化率最后乘积起来也会导致比一般转化率要低而且优化相对复杂。2、这类客户一般都属于理性购买,内容营销是构建用户品牌认知或者选择信任该企业的重要因素之一。3、这类产品一般都有独特的工艺,或者复杂的技术支撑,或者多年行业经验的整合,真正完全用好,需要厂家不断的支持服

  • 手把手教你怎么做Uber与Airbnb那样的平台

    译者:华创资本余跃 摘自:虎嗅本文由华创资本余跃翻译而成,原文载于TechCrunch与FirstRoundCapital,作者系Threadflip的产品负责人AnandIyer。尽管是1年前的文章,不过对于创业者来说,即使放在今天依然值得学习、深思,它讨论了很多热门的Marketplace模式创业公司参考的经验,并以当前炙手可热的Uber和Airbnb为例,不妨一读。本文原标题《解析Uber与Airbnb等新型Marketplace是如何建立信任、提高Liquidity》。概念定义:Liquidity——指的是一个marketplace平台上到底有多容易买到一个商品或者卖出一个商品。如果在一个平台上总是找不到想要的或者卖不出想要的,那么就是死水一潭。反之,用户会越发倾向于选择能够容易满足需求的平台。在2009年的时候,Airbnb每周的收入仅有200美金,频临破产。但在此之后,超过900万人通过它找到了临时住所。Etsy(注:美国著名设计师产品电商平台)也是在近十年前就创建了,但它的估值是在最近两轮融资时翻番。这些Marketplace类型网站(平台型电商)的缓慢但是最终巨大的成功

  • 5分钟深入浅出 HDFS

    通过前面几篇文章的介绍,我们深入讨论了HadoopMapReduce处理数据的过程,以及优化MapReduce性能的方方面面。期间被反复提及的HDFS分布式文件存储系统,一直没有机会深入讲解。那么今天我们就仔细学习一下HDFS是如何工作的。HDFS架构HDFSClient大家还记得我们如何向Hadoopcluster提交任务吗?是通过Hadoopclient进行的。同样,我们和HDFS打交道也是通过一个clientlibrary.无论读取一个文件或者写一个文件,我们都是把数据交给HDFSclient,它负责和Namenodes以及Datanodes联系并传输数据。NameNodes我们在之前的文章中简要提及过HDFS把文件存在多个机器上,并且不把“在哪些机器上存的”,“如何存的”这些内部的信息暴露给使用者,而是只显示给用户一个像普通linux文件结构的文件系统。那么,是谁在管理这些信息的呢?这就是Namenodes.在HDFS里,Namenode保存了整个文件系统信息,包括文件和文件夹的结构。其实和linux上的真的很像,HDFS也是把文件和文件夹表示为inode,每个inode有自己

  • 长期目标

    注意饮食,锻炼身体 住好一点,心情好 学习技术 C++面向对象高效编程 Linux-Android 网络通信-加密解密相关 IDA脚本-OD脚本 Python编程 Android学习网址: https://github.com/codepath/android_guides/wiki   2017年5月25日: elf文件格式 安卓源码(修改反调试相关位置;so加载过程,脱壳;定制系统) hook(java、so) 溯源(IP/邮箱反查询) 漏洞、渗透学习  

  • 金蝶云星空BOS二次开发案例演示

    https://vip.kingdee.com/article/94751030918525696?productLineId=1&isKnowledge=2

  • Vue3的响应式核心原理笔记

    Vue2和Vue3响应式对比 Vue2响应式基于Object.defineProperty原理实现(观察者模式和发布/订阅模式) 当创建Vue实例时,vue会遍历data选项的属性 数据劫持:通过Object.defineProperty为属性添加getter和setter对数据的读取进行劫持 依赖收集:通过getter进行依赖收集 派发更新:通过setter进行派发更新 每个组件实例都对应一个watcher实例,它会在组件渲染的过程中把“接触”过的数据property记录为依赖。之后当依赖项的setter触发时,会通知watcher,从而使它关联的组件重新渲染。 但是基于Object.defineProperty特性无法检测未在data中声明的属性变化,并作出相应的更新 对象和数组都可以采用$set的方式添加响应式的property Vue3响应式原理是基于ES6的Proxy来实现 当一个值被读取时进行追踪:proxy的get处理函数中track函数记录了该property和当前副作用。 当某个值改变时进行检测:在proxy上调用set处理函数。 重新运行代码来读

  • 又有同学要回老家了

    标题挺凄凉,但事实就是这样。本人今年本命年,36岁,对失业恐慌。 一、大概6,7年前,我还在软通做外包,做联想的MES项目,项目组最多的时候80多人。也是个不小的项目,开发周期2年多。项目拆分成各种业务模块。每个模块都有带头技术大哥,后来我做的是Reporting这块业务,技术大哥是微软派来的,技术很牛B,那时候看,就像个带有智能语音功能的百度,只要技术上有问题,问他准保给你准确答案。那时候,他的年龄在33岁左右。项目做完后,不断的有同事离开项目组,最后听说这个大哥回天津了。那时候他的年龄应该和我现在差不多,三十5,6岁。当时很不解,那么好的工作,那么多的工资,为什么选择回老家。 二、昨天晚上和一个同学聊天,起因是,朋友圈高德地图在找架构师。我这个同学,是个不稳定的份子,工资高一些就喜欢跳一下,所以职业生涯的履历上,不太好看。聊了几句,他告诉我他在家几个月了,由于疫情影响,公司大面积裁员,过了年直接把他裁掉了。由于大公司都喜欢背调,所以他基本上在第一轮就被标为不稳定份子刷下来了。我问他有什么打算,他说,硬抗几个月,实在找不到,就要离开了。具体去哪里,做什么,我没有多问。 三、顺着昨晚的

  • redis基础操作

    redis基础数据类型有:string,hash,list,set,zset(有序集合);现总结以上数据类型的基础操作,redis命令不区分大小写: 1、string(字符串): setkeyvalue:设置key值 getkey:获取key值 getrangekeystartend:获取key中的子字符串 getsetkeyvalue:设置新值并返回旧值 getbitkeyoffset:对key的值,获取指定偏移量上的位 mgetkey1[key2...]:获取多个key的值 setbitkeyoffsetvalue:对key的值,设置或清楚指定偏移量上的位 setexkeysecondsvalue:将value赋值给key,并且过期时间为seconds(单位:秒) setnxkeyvalue:如果key不存在,则设置key值为value,如果key存在,则不做操作 setrangekeyoffsetvalue:用value覆盖位置offset及其后的值,超过value长度以后的值保持不变 strlenkey:获取长度 msetkeyvalue[key1value1...]:同时设置

  • 漏洞修复

    SSL/TLS协议信息泄露漏洞(CVE-2016-2183)【原理扫描】 处理:ssl_ciphersHIGH:!aNULL:!MD5:!3DES;这里面禁用DES SSL/TLSBarMitzvahAttack漏洞(CVE-2015-2808) 处理:服务器端禁止使用RC4加密算法,在ssl_ciphers中添加!RC4 一般在nginx配置中禁用弱算法 ssl_ciphersECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!3DES:!ADH:!RC4:!DH:!DHE; 安全开发:SpringBoot打开HttpOnly和Secure属性

  • 2519的blog

    一直找没找到的边即可 对于无解的情况 无向图是存在出度为奇数的点。 有向图是存在入度和出度不一样的点 constintN=1e5+79; constintM=2e5+79; intt,n,m,ot[N],in[N],vis[M<<1]; std::vector<int>g; structgraph{ inthead[M<<1],tot=1,next[M<<1],ver[M<<1]; inlinevoidadd(inta,intb){ ver[++tot]=b; next[tot]=head[a]; head[a]=tot; } }G; inlinevoiddfs(intx){ intnow; for(int&i(G.head[x]);i;i=G.next[i]){ inty(G.ver[i]); if(!vis[i/2]){ vis[i/2]=1; now=i; dfs(y); g.push_back(now); } } } intmain(){ rea

  • 利用layer的mask属性实现逐渐揭示的动画效果

    github上又看到个不错的动画(https://github.com/rounak/RJImageLoader),如图: 所以就想来自己实现以下 不试不知道,这个动画还真不是看上去那么简单,我自己想了半天愣是没做出来,最后还是看了作者的代码,才知道怎么实现。 不过也从作者哪儿学了一招,就是layer.mask的用法。 自己实现的效果如图: demo在这里:https://github.com/Phelthas/LXMRevealDemo (前面的画圆的动画,这是一个CAShaperLayer修改其strokeEnd的动画,比较简单,就没有再写了)       这个动画说难也不难,其关键就在于对layer.mask的特性的运用,如果你不知道layer.mask的特性,那实现起来就相当困难了;相反,如果知道,那思路就豁然开朗了。 关键就是这个:    /*Alayerwhosealphachannelisusedasamasktoselectbetweenthe  *layer'sbackgroundandtheresul

  • [转载]敏感词过滤,PHP实现的Trie树

    原文地址:http://blog.11034.org/2012-07/trie_in_php.html   项目需求,要做敏感词过滤,对于敏感词本身就是一个CRUD的模块很简单,比较麻烦的就是对各种输入的敏感词检测了。用Trie树来实现是比较通用的一种办法吧,之前一直没机会用过这种数据结构,正好试着写了一下。 因为用PHP实现,关联数组用的很舒服。第一个要解决的是字符集的问题,如果在Java中就比较好办统一的Unicode,在PHP中因为常用UTF-8字符集,默认有1-4个字节不同的长度来表示一个字符,于是写了个Util类来将普通的UTF-8字符串转换成字符数组,每一个元素是一个UTF-8串形成的字符。这一点比较容易实现的,根据UTF-8字符集的格式而来就好。 publicstaticfunctionget_chars($utf8_str){ $s=$utf8_str; $len=strlen($s); if($len==0)returnarray(); $chars=array(); for($i=0;$i<$len;$i++){ $c=$s[$i]

  • 单列模式

    publicclassSingleton{ privatevolatilestaticSingletonsingleton; privateSingleton(){} publicstaticSingletongetSingleton(){ if(singleton==null){ synchronized(Singleton.class){ if(singleton==null){ singleton=newSingleton(); } } } returnsingleton; } }复制 publicclassSingleton{ privatestaticclassSingletonHolder{ privatestaticfinalSingletonINSTANCE=newSingleton(); } privateSingleton(){} publicstaticfinalSingletongetInstance(){ returnSingletonHolder.INSTANCE; } }复制  

  • 使用Nethunter(Kali黑客手机)wifite破解无线密码

    简介: NetHunter是一个基于KaliLinux为Nexus设备构建的Android渗透测试平台,其中包括一些特殊和独特的功能。 NetHunter支持无线802.11注入,一键MANAAP搭建,HID键盘(类Teensy攻击)以及BadUSBMITM攻击测试等。 只有部分型号的设备可以刷此系统,比如Google的Nexus、一加等,可以参考官网给出的说明进行选择。 我这里演示的设备是GoogleNexus,如下图: 此外还需要一根转接线和一个外置的网卡, 首先插好外接网卡,开启监听模式。 然后执行wifite-i wlan1启动wifite程序。 此时我们搜索出了许多热点名称,这里我们挑选其中一个名为dlink的热点进行破解。 输入对应热点的序号,回车开始爆破。 这次运气比较好,破解的热点密码恰巧在我们的密码字典里,如下图显示为8个1。 wifite默认自带了一个字典文件/user/share/dict/wordlist-top4800-probable.txt 我们可以将其替换成我们自己的更丰富的字典,网上能下载到一些公开的,但质量都不高,自己平时收藏整

  • vue官网的“资源列表”

      官网: https://cn.vuejs.org/v2/cookbook/adding-instance-properties.html 1.vue官网下面的“资源列表”  

  • CSS3---3.相对父元素的伪类

    a)之前学习的:a:hovera:linka:activea:visited b)以某元素相对于其父元素或兄弟元素的位置来获取无素的结构伪类 f)E:first-child:查找E这个元素的父元素的第一个子元素E g)E:last-child:最后一个子元素 h)E:nth-child(n):第n个子元素,计算方法是E元素的全部兄弟元素 i)E:nth-last-child(n):同E:nth-child(n)相似,只是倒着计算 j)E:nth-child(even):所有的偶数 k)E:nth-child(odd):所有的奇数 l)E:nth-of-type(n):指定类型 m)E:empty选中没有任何子节点的E元素,注意,空格也算子元素 n)E:target结合锚点进行使用,处于当前锚点的元素会被选中 o)重点说明:n遵循线性变化,其取值0、1、2、3、4、...但是当n<=0时,选取无效 p)案例代码: /*第一个li元素*/ li:first-child{ color:red; } /*最后一个元素*/ li:last-child{ color:green; } /*获

  • 量化投资: 第1节 择时策略的开发

    作者:阿布 阿布量化版权所有未经允许禁止转载 abu量化系统github地址(您的star是我的动力!) 本节ipythonnotebook 本节界面操作教程视频播放地址 量化系统一般分为回测模块、实盘模块。 回测模块:首先交易者编写实现一个交易策略,它基于一段历史的交易数据,根据交易策略进行模拟买入卖出,策略中可以涉及买入规则、卖出规则、选股规则、仓位控制及滑点策略等等,回测的目的是验证交易策略是否可行。 实盘模块:将回测通过的策略应用于每天的实时交易数据,根据策略发出买入信号、卖出信号,进行实际的买入、卖出操作。 回测模块最重要的组成部份是择时、选股: 择时(什么时候投资) 选股(投资什么股票) 只有在对的时间买入对的股票才能获利,就像下面张小娴的名言一样,可以把‘股票’代替‘人’完全合乎逻辑。 在对的时间,遇见对的人(股票),是一种幸福 在对的时间,遇见错的人(股票),是一种悲伤 在错的时间,遇见对的人(股票),是一声叹息 在错的时间,遇见错的人(股票),是一种无奈 本节首先讲解择时(什么时候投资),后面的小节将讲解选股 1.买入择时因子的编写 海龟交易法则是量化经典

  • # 859.亲密字符串

    #859.亲密字符串#给定的两有小写字符组成的字符串A和B,只要我们可以交换A洪的2个字母得到与B相同的结果,就返回True;否则返回False。复制 defbuddyStrs(A,B): iflen(A)!=len(B): returnFalse #设置双指针滑动比较 i,j=0,0 count=0 Hash={} CharA=[] CharB=[] #字符串的比较 whilei<len(A)andj<len(B): ifA[i]!=B[j]: count+=1 CharA.append(A[i]) CharB.append(B[j]) #A\B至少有2个字符串不相同,交换后仍不相等,返回False ifcount>2: returnFalse i+=1 j+=1 #A\B只有1个字符串不相同,交换后仍不相等,返回False ifcount==1: returnFalse #A\B只有2个字符串不相同 ifcount==2: ifCharA[0]==CharB[1]andCharA[1]==CharB[0]: returnTrue #A=B,判断A里面是否有重复的

相关推荐

推荐阅读