U3D游戏开发菜鸟面试经历日记(一)

日期:2019/4/10  wpx

被问到的问题:

1.自我介绍

2.为什么辞职?

3.懂哪些排序算法? 冒泡、选择、快排、插入

4.解释一下快速排序?  根据任一被选取的数据,降比他小的数据放他左边,大的放其右,重复这个过程。

5.这些算法的时间复杂度? 冒泡、选择、插入 最好情况都是O(N)快排最好O(n*log2n) 最差都是O(N2

算法最好时间最差时间平均是否稳定
冒泡O(N)O(N2O(n2)
选择O(N)O(N2O(n2)
插入O(N)O(N2O(n2)
快速O(n*log2n)O(N2O(n*log2n)

6.手写快速排序:

    using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Text;
    namespace test
{
    class QuickSort
    {
        static void Main(string[] args)
        {
            int[] array = { 49, 38, 65, 97, 76, 13, 27 };
            sort(array, 0, array.Length - 1);
            Console.ReadLine();
        }
        /**一次排序单元,完成此方法,key左边都比key小,key右边都比key大。
        private static int sortUnit(int[] array, int low, int high)
        {
            int key = array[low];
            while (low < high)
            {
                /*从后向前搜索比key小的值*/
                while (array[high] >= key && high > low)
                    --high; 
                /*比key小的放左边*/
                array[low] = array[high];   
                /*从前向后搜索比key大的值,比key大的放右边*/
                while (array[low] <= key && high > low)
                    ++low; 
                /*比key大的放右边*/
                array[high] = array[low];
            }
            /*左边都比key小,右边都比key大。//将key放在游标当前位置。//此时low等于high */
            array[low] = key;
            foreach (int i in array)
            {
                Console.Write("{0}\t", i);
            }
            Console.WriteLine();
            return high;
        }    
        /**快速排序 
*@paramarry 
*@return */
        public static void sort(int[] array, int low, int high)
        {
            if (low >= high)
                return; 
            /*完成一次单元排序*/
            int index = sortUnit(array, low, high); 
            /*对左边单元进行排序*/
            sort(array, low, index - 1);
            /*对右边单元进行排序*/
            sort(array, index + 1, high);
        }
    }

7.A*寻路算法是如何实现?

核心公式:F=G+H

F - 方块的总移动代价
G - 开始点到当前方块的移动代价(拓展: G = 移动代价 * 代价因子)
H - 当前方块到结束点的预估移动代价(即为当前点到结束点的曼哈顿距离)

A星算法还需要用到两个列表:
开放列表 - 用于记录所有可考虑选择的格子
封闭列表 - 用于记录所有不再考虑的格子

提前将寻路区域分为若干网格,计入障碍物代表网格,在确定了寻路的开始点,结束点的情况下,假定每个方块都有一个F值,该值代表了在当前路线下选择走该方块的代价。
而A星寻路的思路很简单:从开始点,每走一步都选择代价最小的格子走,直到达到结束点。

A星算法伪码:
a、将开始点记录为当前点P
b、将当前点P放入封闭列表
c、搜寻点P所有邻近点,假如某邻近点既没有在开放列表或封闭列表里面,则计算出该邻近点的F值,并设父节点为P,然后将其放入开放列表
d、判断开放列表是否已经空了,如果没有说明在达到结束点前已经找完了所有可能的路径点,寻路失败,算法结束;否则继续。
e、从开放列表拿出一个F值最小的点,作为寻路路径的下一步。
f、判断该点是否为结束点,如果是,则寻路成功,算法结束;否则继续。
g、将该点设为当前点P,跳回步骤c。

(此题答案复制自https://www.cnblogs.com/leoin2012/p/3899822.html

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值