Provide Best Programming Tutorials

拆解复杂问题:实现计算器

我们最终要实现的计算器功能如下: 1、输入一个字符串,可以包含+ - * /、数字、括号以及空格,你的算法返回运算结构。 2、要符合运算法则,括号的优先级最高,先乘除后加减。 3、除号是整数除法,无论正负都向 0 取整(5/2=2,-5/2=-2)。 4、可以假定输入的算式一定合法,且计算过程不会出现整型溢出,不会出现除数为 0 的意外情况。 比如输入如下字符串,算法会返回 9: 3 * (2-6 /(3 -7)) 可以看到,这就已经非常接近我们实际生活中使用的计算器了,虽然我们以前肯定都用过计算器,但是如果简单思考一下其算法实现,就会大惊失色: 1、按照常理处理括号,要先计算最内层的括号,然后向外慢慢化简。这个过程我们手算都容易出错,何况写成算法呢! 2、要做到先乘除,后加减,这一点教会小朋友还不算难,但教给计算机恐怕有点困难。 3、要处理空格。我们为了美观,习惯性在数字和运算符之间打个空格,但是计算之中得想办法忽略这些空格。 我记得很多大学数据结构的教材上,在讲栈这种数据结构的时候,应该都会用计算器举例,但是有一说一,讲的真的垃圾,不知道多少未来的计算机科学家就被这种简单的数据结构劝退了。 那么本文就来聊聊怎么实现上述一个功能完备的计算器功能,关键在于层层拆解问题,化整为零,逐个击破,相信这种思维方式能帮大家解决各种复杂问题。 下面就来拆解,从最简单的一个问题开始。 一、字符串转整数 是的,就是这么一个简单的问题,首先告诉我,怎么把一个字符串形式的正整数,转化成 int 型?…

Continue Reading

Terraform 常用命令详解

Terraform是一个面向客户端的工具,所以对所有资源的管理都是通过Terraform命令来实现的。本文将主要围绕资源的管理和状态的管理来两个方面来介绍涉及到的常用命令。 1 资源管理常用命令 Terraform 对资源的管理主要是对资源生命周期的管理,即通过命令实现对Terraform模板中所定义资源的创建,修改,查看和删除。对这部分的讲解,在之前的文章《Terraform 一分钟部署阿里云ECS集群》的 #3.3 章节有过详细的介绍和代码的演示,大家可移步了解。本文只做基本的回顾。 1.1 terraform plan:资源的预览 plan 命令用于对模板中所定义资源的预览,主要用于以下几个场景: 预览当前模板中定义的资源是否符合管理预期,和Markdown的预览功能类似如果当前模板已经存在对应的state文件,那么 plan 命令将会展示模板定义与state文件内容的diff结果,如果有变更,将会展示结果并在下方显示出来对DataSource而言,执行 plan 命令,即可直接获取并输出所要查询的资源及其属性 1.2 terraform apply:资源的新建和变更 apply 命令用于实际资源的新建和变更操作,为了安全起见,在命令运行过程中增加了人工交互的过程,即需要手动确认是否继续,当然也可以通过 --auto-approve 参数来跳过人工确认的过程。apply 命令适用于以下几种场景: 创建新的资源通过修改模板参数来修改资源的属性如果从当前模板中删除某个资源的定义, apply 命令会将该资源彻底删除。可以理解为“资源的移除也是一种变更” 1.3 terraform show:资源的展示 show 命令用于展示当前state中所有被管理的资源及其所有属性值。 1.4 terraform destroy:资源的释放 destroy 命令用于对资源的释放操作,为了安全起见,在命令执行过程中,也增加了人工交互的过程,如果想要跳过手动确认操作,可以通过 --force 参数来跳过。terraform destroy 默认会释放当前模板中定义的所有资源,如果只想释放其中某个特定的资源,可以通过参数 -target=<资源类型>.<资源名称>  来指定。 1.5 terraform import:资源的导入 import 命令用于将存量的云资源导入到terraform…

Continue Reading

Terraform 是什么

作为本系列的引子,本文将从 Terraform 是什么开始介绍。 Terraform 是什么 如果两年前问 Terraform 是什么,国内熟悉它的人可能并不是很多,毕竟它是2014年的新生儿,提到资源编排,大家能优先想到的也是 AWS 的 CloudFormation,Azure 的 ARM 以及阿里云的 ROS。但是如果今天再问“Terraform 是什么”,相信很大一部分人对它不再陌生,并且一些公司或者感兴趣的开发者已经开始使用 Terraform 来管理他们的基础设施。不论是 Hashicorp 的官方宣传,还是阿里云云栖社区的布道;不论是 Devops的持续发展,还是云原生的火热传播;不论是国内最初只有阿里云支持,还是后来国内其他云厂商的陆续支持,Terraform 近两年在国内被越来越多的提及。 在此之前,不止一篇云栖文章介绍过Terraform是什么,本文将结合Terraform的官方文档,对这些文章中的介绍做一个整理和总结。 2014年,Hashicorp 公司推出了一款产品 Terraform Terraform 官方的定义如下: Terraform is a tool…

Continue Reading

Terraform 的几个关键概念

Terraform 关键概念 在使用Terraform的过程中,通常接触到很多名词,如configuration,provider,resource,datasource,state,backend,provisioner等,本文将一一跟大家介绍这些概念。 Configuration:基础设施的定义和描述 “基础设施即代码(Infrastructure as Code)”,这里的Code就是对基础设施资源的代码定义和描述,也就是通过代码表达我们想要管理的资源。 # VPC 资源 resource "alicloud_vpc" "vpc" { name = "tf_vpc" cidr_block = "172.16.0.0/16" } # VSwitch 资源 resource "alicloud_vswitch" "vswitch" { vpc_id =…

Continue Reading

数字证书原理

文中首先解释了加密解密的一些基础知识和概念,然后通过一个加密通信过程的例子说明了加密算法的作用,以及数字证书的出现所起的作用。接着对数字证书做一个详细的解释,并讨论一下windows中数字证书的管理,最后演示使用makecert生成数字证书。如果发现文中有错误的地方,或者有什么地方说得不够清楚,欢迎指出! 1、基础知识       这部分内容主要解释一些概念和术语,最好是先理解这部分内容。 1.1、公钥密码体制(public-key cryptography) 公钥密码体制分为三个部分,公钥、私钥、加密解密算法,它的加密解密过程如下: 加密:通过加密算法和公钥对内容(或者说明文)进行加密,得到密文。加密过程需要用到公钥。解密:通过解密算法和私钥对密文进行解密,得到明文。解密过程需要用到解密算法和私钥。注意,由公钥加密的内容,只能由私钥进行解密,也就是说,由公钥加密的内容,如果不知道私钥,是无法解密的。 公钥密码体制的公钥和算法都是公开的(这是为什么叫公钥密码体制的原因),私钥是保密的。大家都以使用公钥进行加密,但是只有私钥的持有者才能解密。在实际的使用中,有需要的人会生成一对公钥和私钥,把公钥发布出去给别人使用,自己保留私钥。 1.2、对称加密算法(symmetric key algorithms) 在对称加密算法中,加密使用的密钥和解密使用的密钥是相同的。也就是说,加密和解密都是使用的同一个密钥。因此对称加密算法要保证安全性的话,密钥要做好保密,只能让使用的人知道,不能对外公开。这个和上面的公钥密码体制有所不同,公钥密码体制中加密是用公钥,解密使用私钥,而对称加密算法中,加密和解密都是使用同一个密钥,不区分公钥和私钥。         // 密钥,一般就是一个字符串或数字,在加密或者解密时传递给加密/解密算法。前面在公钥密码体制中说到的公钥、私钥就是密钥,公钥是加密使用的密钥,私钥是解密使用的密钥。   1.3、非对称加密算法(asymmetric key algorithms) 在非对称加密算法中,加密使用的密钥和解密使用的密钥是不相同的。前面所说的公钥密码体制就是一种非对称加密算法,他的公钥和是私钥是不能相同的,也就是说加密使用的密钥和解密使用的密钥不同,因此它是一个非对称加密算法。 1.4、RSA简介 RSA是一种公钥密码体制,现在使用得很广泛。如果对RSA本身有兴趣的,后面看我有没有时间写个RSA的具体介绍。 RSA密码体制是一种公钥密码体制,公钥公开,私钥保密,它的加密解密算法是公开的。 由公钥加密的内容可以并且只能由私钥进行解密,并且由私钥加密的内容可以并且只能由公钥进行解密。也就是说,RSA的这一对公钥、私钥都可以用来加密和解密,并且一方加密的内容可以由并且只能由对方进行解密。 1.5、签名和加密 我们说加密,是指对某个内容加密,加密后的内容还可以通过解密进行还原。 比如我们把一封邮件进行加密,加密后的内容在网络上进行传输,接收者在收到后,通过解密可以还原邮件的真实内容。 这里主要解释一下签名,签名就是在信息的后面再加上一段内容,可以证明信息没有被修改过,怎么样可以达到这个效果呢?一般是对信息做一个hash计算得到一个hash值,注意,这个过程是不可逆的,也就是说无法通过hash值得出原来的信息内容。在把信息发送出去时,把这个hash值加密后做为一个签名和信息一起发出去。 接收方在收到信息后,会重新计算信息的hash值,并和信息所附带的hash值(解密后)进行对比,如果一致,就说明信息的内容没有被修改过,因为这里hash计算可以保证不同的内容一定会得到不同的hash值,所以只要内容一被修改,根据信息内容计算的hash值就会变化。当然,不怀好意的人也可以修改信息内容的同时也修改hash值,从而让它们可以相匹配,为了防止这种情况,hash值一般都会加密后(也就是签名)再和信息一起发送,以保证这个hash值不被修改。至于如何让别人可以解密这个签名,这个过程涉及到数字证书等概念,我们后面在说到数字证书时再详细说明,这里您先只需先理解签名的这个概念。 2、一个加密通信过程的演化…

Continue Reading

编程作业 – 对象和类

(矩形类Rectangle) 设计一个名为Rectangle 的类表示矩形。 这个类包括: 两个名为width 和height 的double 型数据域,它们分别表示矩形的宽和高。width 和 height 的畎认值都为1。创建默认矩形的无参构造方法。— 个创建width 和height 为指定值的矩形的构造方法。一个名为getArea() 的方法返回这个矩形的面积。 (股票类Stock) 设计一个名为Stock 的类。这个类包括: — 个名为symbol 的字符串数据域表示股票代码。一个名为name 的字符串数据域表示股票名字。— 个名为previousClosingPrice 的double 型数据域,它存储的是前一日的股票值0— 个名为currentPrice 的double 型数据域,它存储的是当时的股票值。创建一支有特定代码和名字的股票的构造方法。一个名为getChangePercentO 的方法, 返回从previousClosingPrice…

Continue Reading

编程作业 – 多维数组

(求矩阵中各列数字的和) 编写一个方法,求整数矩阵中特定列的所有元素的和,使用下面的法头: public static double sumColumn(double[][] m, int columnlndex) 编写一个测试程序,读取一个3 x 4 的矩阵,然后显示每列元素的和。 (求矩阵主对角线元素的和) 编写一个方法,求nxn 的double 类型矩阵中主对角线上所有数宇的和,使用下面的方法头: public static double sumMajorDiagonal (double[][] m) 编写一个测试程序,读取一个4 x 4 的矩阵,然后显示它的主对角线上的所有元素的和。 (计算每个雇员每周工作的小时数) 假定所有雇员每周工作的小时数存储在一个二维数组中。每行将一个雇员7 天的工作时间记录在7…

Continue Reading

编程作业 – 方法

(数学:五角数) 一个五角数被定义为n(3n-1)/2, 其中n=1,2,...。所以, 开始的几个数字就是1,5, 12,22, 编写下面的方法返回一个五角数: public static int getPentagonalNumber(int n) 编写一个测试程序显示前100 个五角数,每行显示10 个。 ( 求一个整数各位数字之和) 编写一个方法,计算一个整数各位数字之和。使用下面的方法头: public static int sumDigits(long n) 例如:sumDigits(234)返回9(2+3+4). 提示:使用求余操作符% 提取数字,用除号/ 去掉提取出来的数字。例如:使用234X10 (=4 ) 抽取4。然后使用234/10 (=23…

Continue Reading
Close Menu