一道某高大上互联网公司的笔试题分享

声明:

首先声明,我没有参加此次考试(吾老矣),我只是道听途说,是否真的存在这道试题呢?谁知道呢!在此仅仅是想向大家分享一些知识。

原题大概描述:

给定一个二维数组,里面随机的填写0和1,求取把上下左右连续(斜线不算相连)的1周边0的个数。在这里可以把由1构成数据看成一个岛屿,求岛屿海岸线的长度,即周边0的个数。

引子:

看过人机博弈-吃子棋游戏(二)算气的博友,应该瞬间就有思路了吧。其实围棋的算气,在没有眼位的情况下,就是计算算实心岛屿的海岸线。在有眼位的情况下,围棋算气也是计算空心岛屿内部的海岸线长度和外部海岸线长度。什么是围棋的眼位,请百度之,我们不继续讨论围棋的眼位了。

解决思路:

我并不知道详细的题目,所以对于此题空心岛屿的内部海岸线长度是否需要特殊处理无从知晓。不过,在算气的时候检测是否存在眼位并不难,加标示即可。如果确实是包含空心的岛屿,即形成眼位的围棋,我们可以进行特殊处理。我们只要将总气数扣除内部眼位的气数就ok了,怎么扣除是个问题。

在这里,我说个思路,不一定够好,但可以解决问题。

1.确定内部海岸线的最小包围盒(这里有可能存有外部海岸线,但可以排除大部分外部海岸线),可以节省很多运算。

2.检测包围盒内海岸线点是否可以抵达包围盒的曼哈顿距离最短的边界,如果可以抵达,且与之相连接的海岸线上的点均可抵达,它们都是外部海岸线。

3.否则,如果无法走至包围盒的此边界,则证明其被包围,属于内部海岸线,且与之相连的点均属于内部海岸线。

4.依据上述方法检测包围盒内部的不重复的所有点,即可得出哪些是内部海岸线。

我们知道这个算法效率不高(配合最小包围盒,以及连通点性质相同,实际上寻路的次数应该很少),但它是正确的,被包围的海岸线内部的点,就像困在岛屿里的小怪物,永远无法逃出来。而外部海岸线上的点仅仅会认为岛屿是个障碍物而已。

这个算法可以处理任意复杂的图形,就算山路18弯,外部点也会历经周折到达海岸线,空心岛有好多空心,也不会搞错内部点or外部点。

针对第二点用深度优先搜索或是Astar算法均可以,我们目的是找到路就行,而不是找到最短的路。

总结:

我发博文的时候,并没有把围棋中算气算法抽象成为一个 1,0笔试题。大胆猜测一下,也许出题人正是看到相关博文,才萌生了出此题的想法。我想在CSDN上应该有一部分人更关注笔试题面试题相关的内容,而忽略了本有实质性内容而不是针对笔试题的文章,希望大家能够从各种博客中提取出抽象的知识,以不变应万变。

如果你有更好的思路,可以留言讨论下。

时间: 2024-08-26 23:21:49

一道某高大上互联网公司的笔试题分享的相关文章

一位上了一个大的互联网公司笔试题分享

声明: 首先声明,我没有参加中考(我的老男人).我只是道听途说.这个测试题是否真的存在?谁知道! 在这一点,但想分享一些知识. 有关文字说明原来的问题: 给定一个二维数组,里面随机的填写0和1.求取把上下左右连续(斜线不算相连)的1周边0的个数. 在这里能够把由1构成数据看成一个岛屿,求岛屿海岸线的长度,即周边0的个数. 引子: 看过人机博弈-吃子棋游戏(二)算气的博友,应该瞬间就有思路了吧.事实上围棋的算气,在没有眼位的情况下,就是计算算实心岛屿的海岸线.在有眼位的情况下.围棋算气也是计算空心

互联网校招笔试题分享

Java 一些知识点 Object 有哪些方法 public 方法:getClass.equals(和==之间的区别).hashCode.toString.wait.notify protected 方法:clone.finalize private 方法:registerNatives,该方法作用是将不同平台C/C++实现的方法映射到Java中的native方法 public class Object { private static native void registerNatives()

一道极易出错的笔试题

#include <iostream> using namespace std; void func(int &x, int *x1) { x-=5;; x1+=10; } int main() { int a=100,b=200; func(b,&a); func(a,&b); cout<<a<<","<<b<<endl; } 题目看起来很简单,但很容易出错,此题的结果是 95,195 主要原来在x1

一道不易看明白的笔试题

下列代码编译时会产生错误的是() [cpp] view plaincopy #include <iostream> using namespace std; struct Foo { Foo() {  } Foo(int) {  } void fun()   {  } }; int main(void) { Foo a(10);    //语句1 a.fun();      //语句2 Foo b();      //语句3 b.fun();      //语句4 return 0; } A.

一道极易出错的笔试题2

#include<stdio.h> #include<string.h> int main() { char s[10]="love mm"; s[0]=0;//等价于 s[0]='\0';等价于s[0]=NULL; printf("%s\n",s); return 0; } 输出结果为: 结果是为空的,不明白的话接着看程序 #include<stdio.h> #include<string.h> int main()

接口测试笔试题分享

1.做接口测试当请求参数多时tps下降明显,此接口根据参数从redis中获取数据,每个参数与redis交互一次,当一组参数是tps5133,五组参数是tps1169,多次交互影响了处理性能,请详细阐述如何改进增进效果的方案? tps就是吞吐量,transaction per second.吞吐量下降是可能因为频繁访问redis,而频繁访问redis的原因是参数过多,解决的思路很容易想到:减少参数.我们可以把多组参数变成json字符串之类的一个参数,从而达到信息量不减少而参数个数变少的效果. 2.

Java中有关构造函数的一道笔试题解析

Java中有关构造函数的一道笔试题解析 1.具体题目如下 下列说法正确的有() A. class中的constructor不可省略 B. constructor必须与class同名,但方法不能与class同名 C. constructor在一个对象被new时执行 D.一个class只能定义一个constructor 2.解析说明 (1)class中的构造函数是可以省略的 /** * @Title:User.java * @Package:com.you.user.model * @Descrip

0810------笔试题----------腾讯2012年的一道笔试题

1.题目要求 a)b[i] = a[0] *a[1] *a[2]*….a[n-1]/ a[i],求出数组b: b)要求不能用除法,除循环控制变量以外,不许额外申请其余变量,时间复杂度为O(n),空间复杂度为O(1). 2.程序思路 a)假设 N = 5,那么 b[0] =      a[1]*a[2]*a[3]*a[4];            b[1] = a[0]*     a[2]*a[3]*a[4];            b[2] = a[0]*a[1]*     a[3]*a[4];

关于阿里的一道笔试题分析

其题目如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #pragma pack(2) class A { public:     int i;     union U     {         char buff[13];         int i;     }u;     void foo() {    }     typedef char* (*f)(void*);     enum{red, green, blue} color; }a; class A