Skip to content

Latest commit

 

History

History
154 lines (145 loc) · 5.76 KB

2018-07-19.md

File metadata and controls

154 lines (145 loc) · 5.76 KB

1.Algorithm

这次的练习不算一个算法,是《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

以下是几点的思路:

    1. x初始值为0,所以满足进入while循环的条件只有两个:x < 1 和 x < 4
    1. 整段代码只有一个换行符,输出结果有三行,所以循环里面的代码执行3次。 结合前两点知道,while循环条件应该是x<4,但x<4有4次循环,而实际只有3次。也就是不管x是按1还是2递增,if语句中一定有一个调整了x的值,使循环减少或增加了一次。
    1. 一共有11个空,判断条件(结果为boolean类型的)有3个。剩下8个应该是输出和改变x值的语句。
    1. if分支外的,一共有3个空,也就是每次进入都需要执行的语句有3条。其中两个语句都是紧接着换行符的(第一句和最后一句)。但是3次输出的前两个字符并不相同,所以考虑这两个语句至少有一个是调整x值的。
    1. 后面就是各种尝试了。一般调整循环值放在循环最后,又因为三个输出语句的第一个字符都是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

我的解答:

#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;
            }
        }
    }

2.Review

本周看的是一篇关于CAP的文章,有图示,比较简单明了。An Illustrated Proof of the CAP Theorem 在分布式系统中,P是一定存在的,CAP最多同时满足两个,就是根据业务实际在CA中取舍了。

3.Tips

4.Share

本周在学网络安全的内容。

公钥机制可用来加密(Encryption)和认证(Authentication)。加密时,用接收方的公钥加密,认证时,用发送方私钥加密。有时候易弄混到底是用哪方的什么钥加密。 其实要记住这个,先要弄清加密和认证的作用。 加密是保证信息的机密性,内容不能被篡改,不能被第三方可见。 认真是要确保发送者的身份、资格等。 其次,公钥是可以共享,私钥是个体所有。

当需要接受机密信息时,接收方会把公钥广播出去。发送方(可多个)使用接收方的公钥加密,只有唯一拥有私钥的接收方能够读取信息,也就保证了信息的机密性(confidentiality)。

当要发送的信息本身不一定重要,但确定发送人(认证)是非常重要的时候,发送方会把公钥广播出去,同时将要发送的信息用自己的私钥加密,接收方(可多个)用公钥认证。这样接收方就能确保,信息是来自唯一拥有私钥的发送方。