• 记录一次失败的coding面


      很想去的一家无人驾驶创业公司,技术面过了两面,面试官评价也都不错,败在了最后的coding面上。本来还存在侥幸的心理,但还是在生日这天收到了HR拒绝的电话。

      很没出息的掉了几大滴眼泪,痛定思痛,把那天没做出来的题目又翻出来敲了一次,发现理顺了思路其实真的蛮简单的。被拒绝也是可以理解的吧。

      

      上图是面试官出的题目,题目描述大致为:有一个人被困在最中心五角星标的位置,求最短的出去的路径是多少?每到达一个节点的花费是节点上的数字,出去是指达到白色的没有标数字的区域,迷宫层数不限。

      一开始想用暴力搜索来求解,面试官让计算一下这种算法的时间复杂度,结果是n的指数型的。后来经过面试官提醒,想到了动态规划的求法,但是因为第一次用到嵌套vector,点之间的对应关系也很混乱,代码写得一塌糊涂,中间也多次想放弃。最后还是提交了个半成品上去,自己都不太想再看自己的代码。

      今天重新梳理了一下思路:不考虑往回走(这里只是个假设,是最简单的情况,往回走的情况等以后再思索吧),从n层里回缩,记下与n-1层的每个节点相连的n层节点中最小的节点,一直回缩到第二层,也就是只有4个节点的层,这时候就可以比较四个元素的大小了,从而找到最小路径和。

      程序输入为:第一个数为迷宫层数,然后从内到外输入迷宫的数字,每层按照顺时针顺序输入,从左上角开始。上图的输入应该为:

    3
    1
    6 4 3 2
    7 8 2 9 1 7 8 3
    

      代码如下:

    #include<iostream>
    #include<vector>
    #include<algorithm>
    
    using namespace std;
    
    vector< vector<int> > matrix;  // 存储迷宫
    vector<int> res;  // 存储每次回缩的最小路径
    int shortest;  // 最小路径和(不包括最里层)
    
    
    void dg(int layer_num)
    {
    	if (layer_num == 0)
    	{
           // 第一次使用 std::min()函数, 定义在 #include<algorithm>里
    		shortest = min({ res[0], res[1], res[2], res[3] });
    		return;
    	}
    		
    	int i = layer_num;
    	
    	for (int j = 0; j < 4 * i; j++)
    	{
    		int minX;
    
    		if (j == 0)  // 第一个点单独处理
    		{
    			minX = min({ res[4 * (i + 1) - 1], res[0], res[1] });
    			res[j] = minX + matrix[i][j];
    			continue;
    		}
    		int x = (j - 1) / i;  // 利用x从而简化n层与n-1层点的对应关系
    		if (j%i == 0)   // 三个角(除去第一个点)所连的外层有三个点
    		{
    			minX = min({ res[j + x], res[j + x + 1], res[j + x + 2] });
    		}
    		else  // 内点所连的外层有两个点
    		{
    			minX = min({ res[j + x], res[j + x + 1] });
    		}
    
    		res[j] = minX + matrix[i][j];  // 将n层的最小值回缩并加到第n-1层上
    	}
    	dg(i - 1);  //递归
    
    }
    int main()
    {
    	int layer_num;	
    	vector<int> layer;
    	int ele;
    
    	// 读取图数据
    	cin >> layer_num;
    	for (int i = 0; i < layer_num; i++)
    	{
    		if (i == 0)
    		{
    			cin >> ele;
    			layer.push_back(ele);
    			matrix.push_back(layer);
    			layer.clear();
    			continue;
    		}
    		for (int j = 0; j < 4 * i; j++)
    		{
    			cin >> ele;
    			layer.push_back(ele);
    			if (i == layer_num - 1)
    			{
    				res.push_back(ele);  // 一开始的res初始为最外层的一圈数字
    			}				
    		}
    		matrix.push_back(layer);
    		layer.clear();
    	}
    
    	dg(matrix.size() - 2);
    	cout << shortest + matrix[0][0]<< endl;
    
    	return 0;
    }
    

      

  • 相关阅读:
    Linux_服务器_09_新虚拟机下linux网络配置
    计算机_软件技巧_01_优雅地再word中插入代码
    Tomcat_总结_01_tomcat环境搭建
    gradle_学习_01_gradle安装与基本使用
    Git_学习_01_ git 安装与配置
    redis_学习_02_redis 可视化工具 Redis Desktop Manager
    redis_学习_01_redis的安装
    Idea_学习_08_常用快捷键
    Git_学习_07_ 推送修改到远端
    20180403_调bug_大地保险_jar包冲突
  • 原文地址:https://www.cnblogs.com/ReedLW/p/8945811.html
Copyright © 2020-2023  润新知