霍尔分区

2016年10月28日

最近,我重新燃起了对排序算法的兴趣(这是一种从未真正消失的魅力),我一直在研究快速排序。最常见的学术版本的快速排序使用了一个分区,这是由于Nick Lomuto,它使用一个指针扫描arry,最后在中间使用分区元素,所有小于项在其左侧,所有大于项在其右侧,然后在两部分上递归;分区元素从来都不是快速排序中任何后续递归调用的一部分。

C.A.R.Hoare最初的分区算法的工作方式不同,使用两个指针而不是一个指针。一个指针从数组的左端开始,一直向前移动,直到找到一个不合适的项。另一个指针从数组的右端开始,一直移动到数组的左端,直到找到一个不合适的项。然后交换数组项,每个指针向另一个指针迈出一步,该过程继续,当两个指针交叉时停止,此时将进行最后的交换。Hoare的分区以返回右侧指针结束;指针左侧的所有项,加上指针本身的项,都小于指针右侧的所有项。分区元素位于左侧分区的某个位置,但不一定位于其末尾,这需要更改快速排序算法中的递归调用,其中包括分区元素。

您的任务是实现Hoare的分区,并使用它编写一个快速排序程序。完成后,欢迎您阅读运行建议的解决方案,或在下面的评论中发布自己的解决方案或讨论练习。

页:1 2

审判处

2016年10月25日

这是一个美好的秋季周末:早晨天气晴朗,下午阳光明媚,完全没有理由坐在室内的电脑屏幕前。尽管我工作中的大项目的编程已经完成,但仍有一些细节需要处理,所以我也没有时间在那里。因此,今天的另一个循环练习,也是我最近在初学者留言板上看到的另一项练习:

编写一个程序来确定数字的素因子n个

你应该以一年级程序员的水平写作,不要太复杂。一种合适的算法是试算法。

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

页:1 2

检查原始性

2016年10月21日

[我没有时间准备新的练习,因为我一直忙于完成工作中的一个大项目。所以坏消息是我们有重复练习,但好消息是我的项目完成了!]

我们今天有一个练习,在过去几周里,它至少出现在留言板上十几次;一定是在学期开始编程的时候,学生们正在做他们的期中作业。

编写一个程序,给定一个整数,确定它是否为素数。

你的任务是编写一个程序,确定给定的整数是否为素数,就像初学者对变量赋值和循环的知识缺乏信心一样;不要使用复杂的算法。完成后,欢迎您阅读建议的解决方案,或在下面的评论中发布自己的解决方案或讨论练习。

页:1 2

一个不可能的面试问题

2016年10月18日

今天的练习是来自亚马逊的一个采访问题:

您需要编写一个程序,从输入中读取字符流并从该流中返回随机字符。任何字符返回的概率都应该相等。您只能使用单个字符的存储空间;特别是,您不能保存输入流中的多个字符。

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

页:1 2

还有三个列表操作练习

2016年10月14日

今天我们还有三个列表操作练习,针对那些刚开始的编程课程中途需要练习链接列表的学生:

  1. 定义一个函数,该函数接受两个列表,其中第二个列表是一个长度与第一个列表相同的非负整数列表,并按相反顺序返回第一个列表中的元素列表,每个元素重复第二个列表中相应元素指定的次数。
  2. 重新排列列表中的整数,使所有奇数出现在所有偶数之前,奇数和偶数在输出中的相对顺序与在输入中的顺序相同。
  3. 编写一个函数,返回列表末尾的第n项。

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

页:1 2

三列表操作练习

2016年10月11日

我们必须快到秋季学期的中期了,因为初学者的留言板上已经开始填满了链接列表练习;一个有进取心的家伙甚至给我发了一封电子邮件,要求我帮他做作业。这里有三个任务涉及操纵链接列表。我们可能已经完成了这三个步骤,对于许多阅读和回复本文的人来说,这些步骤足够简单,但学习者似乎对它们有困难,所以我们将在这里进行讨论:

  1. 编写一个函数,该函数接受整数的链表,并返回一个新的链表并删除所有奇数整数。
  2. 编写一个函数,删除每个n个链接列表中的第个项。
  3. 编写一个函数,将列表的两半颠倒过来;如果列表中的项目数是奇数,则中间元素应与列表的后半部分一起使用

您的任务是编写上述三个函数。完成后,欢迎您阅读运行建议的解决方案,或在下面的评论中发布自己的解决方案或讨论练习。

页:1 2

棍枝

2016年10月7日

我们继续我们偶尔的一系列教科书练习:

给你一束棍子,每根都是整数长度。两个木棍可以通过花费两个木棒长度总和的过程组合成一个更大的木棍。你的目标是以最低的成本制作一个将所有原始棍子组合在一起的棍子。

例如,假设您最初有三根长度分别为1、2和4的棍子。你可以花6英镑把木棍2和4组合起来,然后花7英镑把那根木棍和木棍1组合起来,总共花13英镑。但最好先将木棍1和2组合起来,花费3英镑,然后将木棍与木棍4组合起来,总共花费7英镑。

你的任务是编写一个程序,以最小的成本将一堆木棒组合在一起。完成后,欢迎您阅读运行建议的解决方案,或在下面的评论中发布自己的解决方案或讨论练习。

页:1 2

我很尴尬!

2016年10月4日

Matthew Arcus指出了我对上一个问题的解决方案中的一个错误:

>(1234567.9999美元)$1,234,567.100

我不记得以前的编程实践问题中有过类似的错误。

你今天休息一天。你没有运动可做。欢迎参加阅读运行我更正的解决方案,或张贴您自己的解决方案或在下面的评论中讨论练习。

页:1 2