编程珠玑学习笔记

编程珠玑学习笔记

1.在整数的存储方面有时候可以采取位图和位向量来表示。
例如我们可以将集合{1,2,3,5,8,13}存储在下面的这个字符串中:01110100100001000000.
集合中表示数字的各个位设置为1,而其他的位全部设为0.给定了表示文件中整数集合的位图数据结构后,我们可以将编写程序的过程分为3个自然阶段。
第一个阶段关闭所有的位,将集合初始化为空集。
第二个阶段读取文件中的每个整数,并打开相应的位,建立该集合。
第三个阶段检查每个位,如果某个位是1,就写出相应的整数,从而创建已排序的输出文件。
这样输出的文件就已排好序。

2.将n个元素旋转i个位置。例如n=8,i=3,那么向量abcdefgh旋转后得到向量defghabc。
第一种方法是将x[0]放到临时变量t中,然后将x[i]放x[0],x[2i]放x[i]……
a b c d e f g h i j k l m n o p q
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
f g h i j k l m n o p q c d e a b
第二种方法是ab要想转为ba则可以把b中前i个字符和a换。变为abrbi->bibra
m n o p q f g h i j k l a b c d e
h i j k l f g m n o p q a b c d e
f g j k l h i m n o p q a b c d e
f g h i j k l m n o p q a b c d e
第三种方法是ab各自翻转。再整个翻转。ab->[arbr]r->ba
reverse(0,i-1);
reverse(i,n-1);
reverse(0,n-1);
e d c b a q p o n m l k j i h g f
f g h i j k l m n o p q a b c d e
最后一种方法用得时间只有On,也只需要一个字节存储临时变量即可。

3.找出词典中的变位词,例如pots、stop、tops就是变位词
对于这个问题,我们可以分为三个步骤来进行。
第一、对单词进行签名,也就是忽略掉单词各个字母的位置。直接根据26个字母的排位进行签名。
这样就会使所有变位词的签名都变成同一个。
第二、对已签名的文件进行排序,注意是根据它们的签名来排序。
第三、将同一个变位词类中的每个单词挤压到同一行中。例如:
pans anps pans anps pans
pots opst pots anps snap pans snap
pot --->签名-->opt opt --->排序-->opt opt --->挤压--> opt
snap ---> -->anps snap ---> -->opst opst ---> -->post stop tops
stop opst stop opst stop
tops opst tops opst tops

4.c语言标准库中的qsort函数可以实现一个数组的排序。具体参考百科。虽然代码不比冒泡排序少,但是执行时间却少得多。

原文地址:https://www.cnblogs.com/Victorzsg/p/3467515.html