美元格式

2016年9月30日

我们今天有一个简单的任务,一个将数字格式化为美元格式的函数。像1234567.8912这样的数字应该四舍五入到小数点后的两个位置,小数点前每三个位置插入一个逗号,并在前面加一个美元符号;因此,该函数应将1234567.8912格式设置为$1234567.89。

您的任务是编写一个函数,以美元格式返回数字;如果您的语言本身就提供了这样的功能,则不允许您使用它。完成后,欢迎您使用阅读运行建议的解决方案,或在下面的评论中发布自己的解决方案或讨论练习。

页:1 2

三的最大乘积

2016年9月27日

今天的练习来自编程教科书排序章节中的结束语练习:

编写一个程序,找出给定整数数组中三个数字的最大乘积。

你的任务是编写所需的程序。完成后,欢迎您阅读运行建议的解决方案,或在下面的评论中发布自己的解决方案或讨论练习。

页:1 2

水壶拼图

2016年9月23日

有各种各样的谜题,把水从一个水罐倒到另一个水瓶,以达到所需的水量。在我们今天考虑的版本中,我们有两个水罐,可以无限量地装满水,还有一个可以无限量倒入水的排水管。这两个水罐的容量已知,但不可能准确测量水罐的各个部分。

例如,我们希望使用容量为3加仑和5加仑的水罐获得4加仑的水。从两个空罐子开始,可以通过以下六个步骤获得四加仑的水:

  1. 把五加仑的罐子装满。
  2. 从五加仑水罐中倒入三加仑至三加仑水罐,在五加仑水瓶中保留两加仑。
  3. 清空三加仑的水罐。
  4. 从五加仑罐中倒入两加仑到三加仑罐中,五加仑罐为空,三加仑罐为两加仑。
  5. 把五加仑的罐子装满。
  6. 从五加仑水罐中倒出一加仑到三加仑水罐,将其装满,将所需的四加仑留在五加仑水瓶中。

布鲁斯·威利斯(Bruce Willis)有一次明白了这一点;每年成千上万的学童也是如此。

你的任务是编写一个程序,用最少的步骤(填满一个水罐,清空一个水瓶,或将一个水壶倒入另一个水缸)来解决这种水罐问题。完成后,欢迎您阅读运行建议的解决方案,或在下面的评论中发布自己的解决方案或讨论练习。

页:1 2

双向密码

2016年9月20日

一个最近的帖子Reddit要求提供一种将两个明文加密为同一个密文的方法;应用程序位于geocache中,根据解码的消息,一系列缓存将指向两个不同的位置。这是一个有趣的问题,那里的回答错了。幸运的是,海报也在加密reddit和那里的人更乐于助人。

您的任务是编写一个程序,在给定两个不同密钥的情况下,从同一密文中解密两个不同的明文。完成后,欢迎您阅读运行建议的解决方案,或在下面的评论中发布您自己的解决方案。

页:1 2

男人还是男孩

2016年9月16日

在Algol 60的开发过程中,Donald Knuth设计的一个令人讨厌的递归测试:

有相当多的ALGOL60翻译器是为正确处理递归和非局部引用而设计的,我认为可能有一些测试程序是有价值的。因此,我编写了以下简单的例程,可以将man编译器与boy编译器分开:

开始实际程序A(k、x1、x2、x3、x4、x5);k值;整数k;开始实际程序B;开始k:=k-1;B:=A:=A(k、B、x1、x2、x3、x4)结束;如果k≤,则A:=x4+x5,否则为B结束超现实(A(10,1,-1,-1,1,0))结束

这没有使用任何已知的狡猾或含糊不清的东西。我的问题是:答案应该是什么?不幸的是,我自己不需要手动编译,所以我被迫尝试手动计算。我的猜测(可能是错误的)是答案是:

73-119-177+102=-121

我很高兴知道正确的答案。

你的任务是编写一个计算正确答案的程序。完成后,欢迎您阅读运行建议的解决方案,或在下面的评论中发布自己的解决方案或讨论练习。

页:1 2

常见面试问题

2016年9月13日

我最近在提供面试问题的留言板上见过两三次这个问题,所以我想我们应该把它添加到我们的收藏中:

创建并实现一个数据结构,该结构提供

  • 插入
  • 删除
  • 查找最小值
  • 查找最大值
  • 删除最小值
  • 删除最大值

 

所有这些都在O(1)时间内完成,而不管底层数据的类型如何。

您的任务是创建并实现该数据结构。完成后,欢迎您阅读建议的解决方案,或在下面的评论中发布自己的解决方案或讨论练习。

页:1 2

除数道歉

2016年9月9日

今天的练习是我的道歉,因为我写了一段非常糟糕的代码。

在进行近平方除数系列练习时,我发现约数当除数很大时,我通常使用的函数非常慢。

您的任务是编写一个返回数字除数列表的函数,并以合理的效率工作。完成后,欢迎您阅读运行建议的解决方案,或在下面的评论中发布自己的解决方案或讨论练习。

页:1 2

近似平方因子运动在评论中产生了大量的兴趣和几个优秀的解决方案。我们之前研究过Matthew Arcus使用背包算法的解决方案,该算法使用对数将问题从乘法减少到加法,从而允许像C这样的语言使用其本地数据类型来解决问题,而不是切换到大整数。

背包解决方案的工作原理如下:找到n个,系数n个并形成除数列表ds公司然后使用前面练习的子集和算法(背包的一种变体),取乘积而不是求和,找到小于平方根的除数的最大乘积n个有几种方法可以解决子集和问题。标准解决方案使用动态编程。另一个解决方案将问题空间分为两部分。这两个解都需要指数时间,尽管中间相遇解具有更好的渐近时间O(n个2n个/2). 我们还研究了解决方案这需要多项式时间来产生子集和问题的近似答案,尽管这种解决方案对我们没有帮助,因为计算所有除数已经需要指数时间。

今天,我们来看一看评论中隐藏的另一个解决方案,这是保罗·霍夫斯特拉(Paul Hofstra)提出的。以下是他的解决方案:

定义因子(facs):因子=[(1,)+元组(累加(g,mul))for,g in groupby(facs)]div=[1]对于g in因子:div=[d*f代表d in div代表f in g]返回div定义nsd5(数字):“”输出:近似平方因子方法:将因子分成两等份用小因子创建除数并排序(降序)使用大因子创建除数(<=ulimit)并进行排序大除数和小除数的循环与搜索对于最高产品<=ulimit"""ulimit=isqrt(数字)facs=rho_factors(数量)mid=长度(facs)//2降序=反转(排序(除数(facs[:mid]))升序=iter(已排序(除数(facs[mid:]))最佳=0desc=下一个(降序)为True时:对于asc升序:prod=asc*描述如果prod>最佳:如果prod<=ulimit:最佳=产品其他:打破其他:休息#while对于降序中的desc:prod=asc*描述如果prod<=ulimit:如果prod>最佳:最佳=产品打破其他:中断#while返回最佳

有了这个解决方案,我们又回到了使用大整数,并使用子集和解决方案的中间相遇变量来计算答案。该解决方案找到因子,将它们分成两半,计算每一半的除数,然后使用子集和来找到小于平方根的最大除数。注意,我们不需要计算所有的除数,只需要计算两个半的除数。

您的任务是实现Hofstra对近似平方因子问题的解决方案,并使用它计算小于190的素数乘积的近似平方因子。完成后,欢迎您阅读运行建议的解决方案,或在下面的评论中发布自己的解决方案或讨论练习:

页:1 2

给定两个列表,合并点是两个列表相同并可以合并的点。例如,给定列表(a b c x y z)和(g h i x y z),合并点位于(x y z)。如果两个列表中的最后一项不同,则合并点为空;如果两个列表相同,则整个列表就是合并点。

你的任务是编写一个程序,找到两个列表的合并点;它应该返回第一个列表的唯一前缀、第二个列表的惟一前缀和两个列表的公共后缀。完成后,欢迎您阅读运行建议的解决方案,或在下面的评论中发布自己的解决方案或讨论练习。

页:1 2