首页 新闻 赞助 找找看

最新面试问题,高手请进!网络和3个桶装水问题

0
悬赏园豆:30 [已解决问题] 解决于 2012-06-15 14:28

本人学C#.net的,最近在找工作时,遇到几个有些难度的面试问题,看有没有高手能够解答:

1.有两台电脑A和B,A中放Web应用程序,B中放数据库,原来A可以直接访问B中数据库,但是由于

安全原因,现在不允许A直接访问B了,A需要通过另外一台电脑C来访问B中数据库,请问如何实现

?(注意:C中无IIS,也没有数据库软件,也不能存储,近乎裸机)


2.通过某个网址URL可以访问到服务器A,如果服务器A停电了,如何让这个URL自动连接到备用服

务器B ?


3.有3个桶都没有刻度,A桶容量13L,装有10L水,B桶7L装有3L水, C桶6L装有2L水,如何使3个桶

各装5L水?求算法或C#代码

问题补充:

谢谢各位,补充一下,第2题中,是应用程序服务器停电,而不是数据库服务器停电,如果只是数据库断线应该比较好处理,而且同样的URL网址要自动连接到一台应用服务器上,注意是自动不是手动去修改。

第3题中,确实不能刻刻度,也不能用肉眼去比较,不能用一个5L的高度去比较另一个5L,因为并没有说桶的底面积是一样的,也许是不规则的桶呢,所以只能计算

cjk的主页 cjk | 初学一级 | 园豆:164
提问于:2012-05-31 18:36
< >
分享
最佳答案
0

1、三层架构。在C服务器上写一个服务,Windows服务(基于Socket访问)或WCF服务或WEBSERVICE服务都可以。

2、使用热备功能实现(假如你希望A能用的时候不访问B,数据库的安全一般就使用热备)或者使用负载均衡(两台服务器会同时负担访问请求)

3、

A->B:A(6)、B(7)

A->C:A(2)、C(6)

(先去做饭,再想想)

收获园豆:15
无之无 | 大侠五级 |园豆:5095 | 2012-05-31 19:50

简单的想了下,3个桶。。。这样的容量,有点困难。头痛,先不想了。

无之无 | 园豆:5095 (大侠五级) | 2012-05-31 21:00

第一问题,由于C中没有IIS也没有数据库,所以WCF服务或WEBSERVICE服务都不行,这两个方法我当时就提出但是被面试官否定了,Windows服务(基于Socket访问)具体怎么实现?能让A通过C来访问B中数据库吗?愿闻其详,谢谢!

cjk | 园豆:164 (初学一级) | 2012-06-06 18:45

@cjk: 

1、C中没IIS不等于不能运行WCF。不过,WCF一般的运行是需要IIS。

2、SOCKET通信,这个就需要你去深入了解了,说白了,就是在服务器写一个端口监听程序,有监听就启动一个线程执行请求并返回结果,IIS服务本身就是一个SOCKET通信程序

3、还可以使用REMOTE技术,REMOTE技术是不需要IIS服务支撑的。

无之无 | 园豆:5095 (大侠五级) | 2012-06-07 08:03

@cjk: 还有一个可考虑的方案就是使用端口转发,让C只是一个端口代理服务器,所有的请求发送到C,而C却什么都不做,只是左手右手的把问题交给B来实现。

端口转发软件市面不少,可以搜索下,PORTTUNNEL是其中的一个。

无之无 | 园豆:5095 (大侠五级) | 2012-06-07 08:05
其他回答(7)
0

2.如果AB在一起,可以用负载平衡,如果不在一起,可以通过更新DNS的A记录让URL转向到B服务器.

happydaily | 园豆:301 (菜鸟二级) | 2012-05-31 18:50
0

 第一题 我想到了 3层架构

第二题 利用服务器连接超时情况

第三题 假设有一个容量为5L的桶D 然后你懂得。。。

何冬冬 | 园豆:202 (菜鸟二级) | 2012-05-31 19:02
0

关于第三题:
如果桶是不透明的话,正常来说应该是无解.推理如下:
假设最后能做到三个都是5L,那么它的前一步必须是有一个是5L,一个大于5L,一个小于5L.它的步骤必然是从大于5L倒到小于5L的桶里.可是从题目中,由于没有多余的水,同时桶的大小都是大于5L的,这时候就不能做到这一点.
举个例子:
最后要从A倒到B中.B<5L,可以是4,3,2,1,0.对应的A是6,7,8,9,10.这时候无论怎么倒都不能倒出2个5L.
反过来如果要从B倒到A中,B>5L,可以是6,7,A可以是4,3,这也倒不出2个5L.
对于AC组合和BC组合也是一样,所以我推论是没办法做到的.

换一种思路的话,如果这个桶是透明的话,可以做到.一开始就可以将B倒到C中得到5L,然后按照这个5L的高度将A倒到B中(或者使得AB平均).

收获园豆:5
davp_p | 园豆:207 (菜鸟二级) | 2012-05-31 21:02

用了宽搜的方法搜了所有的情况,的确是搜不出5,5,5,先买个面吃,等会回来贴代码.

支持(0) 反对(0) davp_p | 园豆:207 (菜鸟二级) | 2012-05-31 21:35

@davp_p: 

宽搜算法:

以三个桶的水量为状态,初始状态即为(10,3,2),最多会有13*7*6种状态,用一个3维数组把这些状态存起来.

由于只有三个桶,在一次倒水的时候只有6种可能:A->B,A->C,B->A,B->C,C->A,C->B,如果是能倒出结果,那么在这一步的倒水方法里面必然在这6种可能里面.

建一个队列,头即为(10,3,2),在队列上加上它可能到达的可能(最多6个),移出头到下一个点,再加上它到达的可能,这样一直加下去直到有(5,5,5)或者把所有可能都取完(队列为空).加结点的前先看3维数组中是否已经有该状态.如果队列为空则无解.

代码我是用java写的,不知道要不要.

支持(0) 反对(0) davp_p | 园豆:207 (菜鸟二级) | 2012-06-01 13:24
0

1、有很多种方法,让A访问B时,强制经过C路由,或者在C上安装代理,让A通过C的代理访问B。

2、反向代理。不光可以用于处理服务器故障热切换,还可以负载均衡。

3、将C中的2L,倒入B,这样B中就有5L水,记下这个时候B桶中装有5L水的位置,标上刻度。

将B中的水全部倒回C。此时C中有5L水,将A口的水倒往B。以之前标上的刻度为准。此是B中5L,A中剩余5L。

收获园豆:10
路人已 | 园豆:228 (菜鸟二级) | 2012-06-01 07:37

这个方案倒是可行!

不过。。。或许考官的目的就是要得到这样的答案。有时程序员写程序的时候总是陷入理想化(嘿嘿,我就是),钻入了死点。

如果一定要用三个桶倒来倒去,那么。。。我还没想出来怎么不做标记的情况下能倒出3个5。

题目可能只是让我们换个角度、换个思路来解决问题,必要的时候借助外力!

支持(0) 反对(0) 无之无 | 园豆:5095 (大侠五级) | 2012-06-01 09:03

第1个问题,让A通过C的代理访问B,听起来好像是不错的,但是具体如何实现呢?我知道局域网可以通过代理服务器访问Internet,但是现在是A是要访问B的数据库,不是访问某个网址,而且C中也没有IIS,比如我们现在要指定A中数据库连接字符串,connectionString="Data Source=192.168.1.x\sql2005,这里用C

的IP地址肯定是不行的,用B的ip也不行,应为B中根本没有数据库,该如何实现代理呢?

支持(0) 反对(0) cjk | 园豆:164 (初学一级) | 2012-06-06 18:38

@cjk: 所谓代理,其实你可以理解为路由一样,本身是没有任何应用层服务的,它只是负责转发而已。

就像网络上所有的交换机和路由器,它们没有提供IIS,没有FTP,没有游戏服务,而我们都是直接与这些网关、路由器通讯的。

代理的原理其实跟路由是差不多的,就是看起来就像是C上面的数据库一样,其实C是没有的。C只是把所有的通讯都转发给了B而已,然后B再回复给A。这样C就充当起了完全的“中间人”。中间人是没有任何有效的功能的,它的功能只是转发。

支持(0) 反对(0) 路人已 | 园豆:228 (菜鸟二级) | 2012-06-06 21:14
0

第三题:先将B中的全部倒入C中,C就满了5L ,再将A中的水到一半到B中就行了 。

cici.fan | 园豆:46 (初学一级) | 2012-06-01 10:30
0

我觉得倒水的问题,应该不准刻刻度!

xu_happy_you | 园豆:222 (菜鸟二级) | 2012-06-01 11:14
0

算不出来,三个瓶子各5L水,必须同时成立,不管假设三个瓶子中的哪一个有5L水,另外2个都对不出来5L。实在想不出来

疯狂土豆丝 | 园豆:209 (菜鸟二级) | 2012-06-04 19:14
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册