程序员笔试面试题交流

程序员面试修炼02 | 百度2017笔试题

2018-05-07  本文已影响11人  淇奥qiaoqiao

正如百年前电能改变了很多行业一样,人工智能也正在改变着医疗、交通、娱乐、制造业等主要行业,丰富充实着无数人的生活。对于人工智能将带领我们前往何方,我比以往都要兴奋和期待。——吴恩达


名词解释

防火墙:一个由软件和硬件设备组合而成,在内部网和外部网之间、专用网与公共网之间的界面上构造的保护屏障,它是一种计算机硬件和软件的结合,使Internet与Intranet之间建立起一个安全网关(Security Gateway),从而保护内部网免受非法用户的侵入。防火墙主要由服务访问规则、验证工具、包过滤和应用网关4个部分组成。 在网络中,所谓“防火墙”,是指一种将内部网和公众访问网(如Internet)分开的方法,它实际上是一种隔离技术。

笔试真题

题目(2017百度笔试题):

拉姆刚开始学习英文单词,对单词排序很感兴趣。如果给拉姆一组单词,他能够迅速确定是否可以将这些单词排列在一个列表中,使得该列表中任何单词的首字母与前一单词的为字母相同。

你能编写一个程序来帮助拉姆进行判断吗?

解题思路

    本题如果是直接按顺序就很简单,判断下当前单词开头是不是等于前一个单词结尾就行了。但如果是可以调换顺序,就变成了一个一笔画的问题。首先判断是否存在欧拉通路,将单词建成一副图,取出每个单词的第一个字母和最后一个字母,连一条有向边;然后根据欧拉通路的性质,判断下每个点的入度出度(奇数度的点不能大于2);最后bfs判断图是否是连通图。

下面来看解题代码:


#include

#include

#include

#include

#include

using namespace std;

char str[300];

int g[30][30];

int In[30];

int Out[30];

int num[30];

void init()

{

      memset(g, 0, sizeof(g));

      memset(In, 0, sizeof(In));

      memset(Out, 0, sizeof(Out));

      memset(num, 0, sizeof(num));

}

bool bfs(int s,int n)

{

      queue q;

      q.push(s);

      int mark[30];

      memset(mark, 0, sizeof(mark));

      while (!q.empty())

      {

             int front = q.front();

             mark[front] = 1;

             q.pop();

             for (int i = 0; i < 30; i++)

             {

                    if (g[front][i] && mark[i] == 0)

                    {

                           g[front][i] = 0;

                           q.push(i);

                    }

             }

      }

      int ha = 0;

      for (int i = 0; i < 30 ;i++)

      {

             if (mark[i]) ha++;

             if (ha==n) return true;

      }

      return false;

}

int main()

{

      int n,s;

      //freopen("data.txt", "r", stdin);

      while (cin >> n)

      {

             init();

             bool temp = true;

             for (int i = 0; i

             {

                    cin >> str;

                    int len = strlen(str);

                    Out[str[0] - 'a']++;

                    In[str[len - 1] - 'a']++;

                    g[str[0] - 'a'][str[len - 1] - 'a'] = 1;

                    g[str[len - 1] - 'a'][str[0] - 'a'] = 1;

                    if (num[str[0] - 'a'] == 0) num[str[0] - 'a'] =1;

                    if (num[str[len - 1] - 'a'] == 0) num[str[len -1] - 'a'] = 1;

                    s = str[0] - 'a';

             }

             int sum1 = 0;

             int sum2 = 0;

             for (int i = 0; i < 30; i++)

             {

                    if ((In[i] - Out[i]) >=1) sum1++;

                    if ((In[i] - Out[i]) <= -1) sum2++;

                    if (abs(In[i] - Out[i])>1) temp = false;

             }

             if (sum1 >= 2 || sum2 >= 2) temp = false;

             int ha = 0;

             for (int i = 0; i < 30; i++)

             {

                    if (num[i] == 1) ha++;

             }

             temp = temp & bfs(s,ha);

             if (temp) cout << "Yes" << endl;

             else cout << "No" << endl;

      }

}


技术知识点

http和https的区别与联系

    超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此,HTTP协议不适合传输一些敏感信息,比如:信用卡号、密码等支付信息。

    为了解决HTTP协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议HTTPS,为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。

HTTP和HTTPS的基本概念

HTTP:是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少。

HTTPS:是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。

HTTPS协议的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性。

HTTP和HTTPS的主要区别

1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。

2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。

3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。

4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

HTTPS的工作原理

    我们都知道HTTPS能够加密信息,以免敏感信息被第三方获取,所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用HTTPS协议。

1、客户端发起HTTPS请求

这个没什么好说的,就是用户在浏览器里输入一个https网址,然后连接到server的443端口。

2、服务端的配置

采用HTTPS协议的服务器必须要有一套数字证书,可以自己制作,也可以向组织申请,区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面(startssl就是个不错的选择,有1年的免费服务)。这套证书其实就是一对公钥和私钥,如果对公钥和私钥不太理解,可以想象成一把钥匙和一个锁头,只是全世界只有你一个人有这把钥匙,你可以把锁头给别人,别人可以用这个锁把重要的东西锁起来,然后发给你,因为只有你一个人有这把钥匙,所以只有你才能看到被这把锁锁起来的东西。

3、传送证书

这个证书其实就是公钥,只是包含了很多信息,如证书的颁发机构,过期时间等等。

4、客户端解析证书

这部分工作是有客户端的TLS来完成的,首先会验证公钥是否有效,比如颁发机构,过期时间等等,如果发现异常,则会弹出一个警告框,提示证书存在问题。如果证书没有问题,那么就生成一个随机值,然后用证书对该随机值进行加密,就好像上面说的,把随机值用锁头锁起来,这样除非有钥匙,不然看不到被锁住的内容。

5、传送加密信息

这部分传送的是用证书加密后的随机值,目的就是让服务端得到这个随机值,以后客户端和服务端的通信就可以通过这个随机值来进行加密解密了。

6、服务段解密信息

服务端用私钥解密后,得到了客户端传过来的随机值(私钥),然后把内容通过该值进行对称加密,所谓对称加密就是,将信息和私钥通过某种算法混合在一起,这样除非知道私钥,不然无法获取内容,而正好客户端和服务端都知道这个私钥,所以只要加密算法够彪悍,私钥够复杂,数据就够安全。

7、传输加密后的信息

这部分信息是服务段用私钥加密后的信息,可以在客户端被还原。

8、客户端解密信息

客户端用之前生成的私钥解密服务段传过来的信息,于是获取了解密后的内容,整个过程第三方即使监听到了数据,也束手无策。


免费领取

在公众号对话框内回复 【简历模版】, 即可获得小编精选的简历模版

关注【19应届生】可获得更多真题解析~

image
上一篇 下一篇

猜你喜欢

热点阅读