有序元音

2017年1月31日

今天的练习是编写一个程序,在字典中查找所有单词,其中单词中的所有元音都以升序出现。单词中没有必要全部出现五个元音,元音可能会加倍。例如,正在进行因为这三个元音,,o个o个以非递减顺序出现。

解决此问题的一种简单方法是使用正则表达式:

$grep'^[^aeiou]*a*[^aeiou]*e*[^aeiou]*i*[^ aeiou]*o*[^Aeou]*u*[^aiiou]$'/etc/dict/words

因为这很容易,所以你必须编写一个程序使用正则表达式。

你的任务是编写一个程序来查找包含有序元音的单词。完成后,欢迎您阅读运行建议的解决方案,或在下面的评论中发布自己的解决方案或讨论练习。

页:1 2

换行符

2017年1月27日

所有文本处理器都需要代码将段落中的单词拆分成不大于给定宽度的行,这一过程称为换行。有多种算法来执行这个过程,从简单到复杂,它们产生各种不同程度的“美学”输出。大多数算法试图安排段落的所有行,使它们的长度大致相同,这样可以减少文本外观上可能会分散读者注意力的视觉差异。

一个简单的换行算法是贪婪算法:将尽可能多的单词放在每一行上,然后转到下一行。例如,给定文本“aaa-bb-cc-ddddd”和线宽6,输出如下所示:

------        ------aaa bb aaa抄送bb抄送ddddd ddddd------        ------

贪婪算法将使用的行数减至最少,但大多数断线算法更喜欢将“粗糙度”减至最少。一种常用的美学度量方法是将行末的松弛度减至最少;具体地说,它寻求每一行末尾的空格数的平方的最小和。左上方显示的格式在第一行末尾没有空格,第二行末尾有4个空格,第三行末尾有1个空格,总时差为0+42+ 12= 17. 平方的目的是更严厉地惩罚大量的松弛。

右上方显示了更好的格式。它在第一行末尾有3个空格,在第二行末尾有1个空格,并且在第三行末尾有一个空格,总时差为32+ 12+ 12= 11.

从算法的角度来看,这是一个可以通过动态编程在二次时间内解决的最小化问题:遍历单词列表,计算每个单词后到该点的最小空闲时间,然后添加下一个单词并重新计算。计算最小化时使用的主要数据结构是一个上三角矩阵,如下所示:

aaa bb cc ddddd-----------------------------------0    3     0    -3    -9          0    3     01          4     1    -5          1          4     12                4    -2          2                43                      1          3                      1----- ----- ----- -----           ----- ----- ----- -----

第一行计算为3,即放置后剩余的空间数原子吸收光谱在一行上,0,这是放置后剩余的空格数aaa英国广播公司在一行上,-3,这是放置后剩余的空格数aaa bb抄送和-9,这是放置后剩余的空格数aaa英国广播公司cc ddddd在线上;显然,第一行上的最后两个条目是不可行的,因为线宽超过了可用空间。第二行计算为4,这是放置后剩余的空间数英国广播公司在一行上,1,表示放置后剩余的空格数bb抄送在一行上,和-5,这是放置后剩余的空格数bb抄送ddddd在线上;行上的最后一项不可行。同样,第三行和第四行也是如此。上面右侧显示了上三角矩阵的可行部分。

下一步是在每列中取最小可行值:3、0、1和1;如果将其平方并计算总和,则得到32+ 02+ 12+ 12=11,这是我们上面计算的成本。更有趣的是取每列中最小可行值的索引,即0、0、1和3(原子吸收光谱列位于索引0处英国广播公司列位于索引0处复写的副本列位于索引1ddddd公司列位于索引3)。然后我们使用指数最小值成对计算换行符,如下所示:第一对0,0为空;第二对0,1定义第一输出线的边界;第三对1、3定义第二输出线的边界;而隐式对3、4(4是输入的末端)定义了第三输出行的边界。

这就是算法。请注意,将其简化为代码可能会很棘手(我不止一次弄错了),因为您必须小心地保持行和列索引笔直,并且必须记住何时加减1以指向上一列或下一列或行。该算法在计算和操作上三角矩阵时明显具有二次时间和空间复杂度。

您的任务是编写一个程序,用上面描述的动态编程算法格式化段落。完成后,欢迎您阅读运行建议的解决方案,或在下面的评论中发布自己的解决方案或讨论练习。

页:1 2

独特的单词

2017年1月24日

我不确定今天练习的原始来源;这可能是一个家庭作业问题或面试问题:

给定一个巨大的单词文件,按升序打印其中所有不同的单词;“巨大”的定义是“太大了,内存无法容纳。”

你的任务是编写一个程序,在一个巨大的文件中打印所有不同的单词。完成后,欢迎您阅读运行建议的解决方案,或在下面的评论中发布自己的解决方案或讨论练习。

页:1 2

练习2-4

2017年1月20日

我很喜欢这些小练习C程序设计语言Brian W.Kernighan和Dennis M.Ritchie。我们今天再做一次。

在第2.8节中,Kernighan和Ritchie给出了一个函数挤压删除所有字符c(c)从字符串以下为:

/*挤压:从s中删除所有c*/空隙挤压(char s[],int c){整数i,j;对于(i=j=0;s[i]!='\0';i++)如果(s[i]!=c)s[j++]=s[i];s[j]“\0”;}

然后,在练习2-4中,他们要求读者“编写挤压(s1,s2)删除中的每个字符第1页与中的任何字符匹配一串 s2秒.”

您的任务是编写两个版本的挤压用你最喜欢的语言;如果你选择C,一半的工作已经完成。完成后,欢迎您阅读运行建议的解决方案,或在下面的评论中发布自己的解决方案或讨论练习。

页:1 2

练习1-9

2017年1月17日

有时,最好回到基础上来。下面是练习1-9C程序设计语言作者:Brian W.Kernighan和Dennis M.Ritchie:

编写一个程序将其输入复制到输出,用一个空格替换一个或多个空格的每个字符串。

你的任务是为练习1-9写一个解决方案。完成后,欢迎您阅读运行建议的解决方案,或在下面的评论中发布自己的解决方案或讨论练习。

页:1 2

电话键盘上的单词

2017年1月13日

电话键盘上的数字与字母相关;例如,数字2与字母A、B和C相关联,数字7与字母P、Q、R和S相关联。因此,可以将单词转换为其数字等价物;例如,PRAXIS可以转换为数字772947。转换不一定是唯一的,因此ACT、BAT和CAT都转换为228。

您的任务是编写一个程序,该程序接受一个数字,例如228,并返回字典中由该数字表示的所有单词的列表。完成后,欢迎您阅读运行建议的解决方案,或在下面的评论中发布自己的解决方案或讨论练习。

页:1 2

基本字符串

2017年1月10日

今天的练习很容易描述,但有一些棘手的边缘情况,很难实现:

给定按顺序附加的质数字符串-2357111317192和索引n个,返回从索引开始的五位数字符串n个。例如,从索引开始的五个字符n个=50等于03107。素数字符串的前61个字符如下所示:

0 1 2 3 4 5 601234567890123456789012345678901234567890123456789012345678902357111317192329313741434753596167717379838997101103107109113

您的任务是编写一个程序来查找从n个第个字符。完成后,欢迎您阅读运行建议的解决方案,或在下面的评论中发布自己的解决方案或讨论练习。

页:1 2

斐波纳契数

2017年1月6日

090208英尺

数学家是奇怪的人:

两个人共用一盘玉米片。他们轮流分玉米片,每个玉米片n个第个斐波那契数列n个第个转弯。当剩下的nachos数小于下一个斐波那契数时,他们重新开始序列。什么数量的玉米片(少于500片)需要最多的重新启动次数?

例如,如果您从n个=11片玉米片,第一个人吃1片玉米卷(剩下10片),第二个人吃1块玉米片(剩下9片),第一个人喝2片玉米片(留下7片),另一个人吃3片玉米片。然后,第一个人吃1片玉米片(剩下3片),第二个人吃1块玉米片(留下2片),第一个人喝2片玉米片。有两次重启,我们可以记为[1,1,2,3],[1,1,2]。

fibonacho数字是那些起始数字n个这需要比任何较小数量更多的重启。因此,第一个斐波纳克数是[1]中的1,第二个斐波那克数是[1,1]、[1]中的3,第三个斐波拿克数是[1,1,2,3]、[1,1]和[1]中的10,依此类推。

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

页:1 2