这次的练习不算一个算法,是《head first java》上的一个puzzle,觉得挺有意思,做了蛮久才做出了,但是看完答案之后又觉得自己有点想太多。思路其实应该更清晰。 谜面如下
class PoolPuzzleOne {
public static void main(String [] args) {
int x = 0;
while ( __________ ) {
_____________________________
if ( x < 1 ) {
___________________________
}
_____________________________
if ( __________ ) {
____________________________
___________
}
if ( x == 1 ) {
____________________________
}
if ( ___________ ) {
____________________________
}
System.out.println(““);
____________
}
}
}
每行填一条语句,每个语句仅能用一次,可填入的语句如下:
x = x + 1;
x = x + 2;
x = x - 2;
x = x - 1;
x > 0
x < 1
x > 1
x > 3
x < 4
System.out.print(“ ”);
System.out.print(“a“);
System.out.print(“n“);
System,out,print(“an“);
System.out.print(“noys“);
System.out.print(“oise“);
System.out.print(“ oyster“);
System.out.print(“annoys”);
System.out.print(“noise”);
输出应该如下:
%java PoolPuzzleOne
a noise
annoys
an oyster
以下是几点的思路:
-
- x初始值为0,所以满足进入while循环的条件只有两个:x < 1 和 x < 4
-
- 整段代码只有一个换行符,输出结果有三行,所以循环里面的代码执行3次。 结合前两点知道,while循环条件应该是x<4,但x<4有4次循环,而实际只有3次。也就是不管x是按1还是2递增,if语句中一定有一个调整了x的值,使循环减少或增加了一次。
-
- 一共有11个空,判断条件(结果为boolean类型的)有3个。剩下8个应该是输出和改变x值的语句。
-
- if分支外的,一共有3个空,也就是每次进入都需要执行的语句有3条。其中两个语句都是紧接着换行符的(第一句和最后一句)。但是3次输出的前两个字符并不相同,所以考虑这两个语句至少有一个是调整x值的。
-
- 后面就是各种尝试了。一般调整循环值放在循环最后,又因为三个输出语句的第一个字符都是a,可以考虑最后一句是修改x值的,
第一句是输出
System.out.print(“a“);
那么同时排除两个输出语句:System,out,print(“an“); System.out.print(“annoys”);
同时还可以判断三个输出语句一定各输出一次:System.out.print(“ oyster“); System.out.print(“noys“); System.out.print(“ ”);
所以需要占用3个if分支。 如果System.out.print(“noise”);
输出一次,则System.out.print(“n“);
输出两次。 如果System.out.print(“oise“);
输出一次,则System.out.print(“n“);
输出三次。这条语句就可以放在if分支的另外一个空。 所以4个输出一次的语句,符合四个if分支的判断次数。其中if分支包含两条语句的,另外一个空可用来调整x值,改变循环次数。 最好的不重合的if分支就是x<1 x==1 x>1
- 后面就是各种尝试了。一般调整循环值放在循环最后,又因为三个输出语句的第一个字符都是a,可以考虑最后一句是修改x值的,
第一句是输出
我的解答:
#include <stdio.h>
int main()
{
int x = 0;
while( x<4 ){
printf("a");
if( x < 1 ){
printf(" ");
}
printf("n");
if( x < 1){
x= x-1;
printf("oise");
}
if( x == 1 ){
printf("noys");
}
if( x > 1 ){
printf(" oyster");
}
printf("\n");
x = x+2;
}
return 0;
}
书上的答案:
class PoolPuzzleOne {
public static void main(String [] args) {
int x = 0;
while ( X < 4 ) {
System.out.print(“a”);
if ( x < 1 ) {
System.out.print(“ “);
}
System.out.print(“n”);
if ( X > 1 ) {
System.out.print(“ oyster”);
x = x + 2;
}
if ( x == 1 ) {
System.out.print(“noys”);
}
if ( X < 1 ) {
System.out.print(“oise”);
}
System.out.println(““);
X = X + 1;
}
}
}
本周看的是一篇关于CAP的文章,有图示,比较简单明了。An Illustrated Proof of the CAP Theorem 在分布式系统中,P是一定存在的,CAP最多同时满足两个,就是根据业务实际在CA中取舍了。
本周在学网络安全的内容。
公钥机制可用来加密(Encryption)和认证(Authentication)。加密时,用接收方的公钥加密,认证时,用发送方私钥加密。有时候易弄混到底是用哪方的什么钥加密。 其实要记住这个,先要弄清加密和认证的作用。 加密是保证信息的机密性,内容不能被篡改,不能被第三方可见。 认真是要确保发送者的身份、资格等。 其次,公钥是可以共享,私钥是个体所有。
当需要接受机密信息时,接收方会把公钥广播出去。发送方(可多个)使用接收方的公钥加密,只有唯一拥有私钥的接收方能够读取信息,也就保证了信息的机密性(confidentiality)。
当要发送的信息本身不一定重要,但确定发送人(认证)是非常重要的时候,发送方会把公钥广播出去,同时将要发送的信息用自己的私钥加密,接收方(可多个)用公钥认证。这样接收方就能确保,信息是来自唯一拥有私钥的发送方。