面经准备-旷视

一.  字符的全排列

对一个数组进行全排列,无重复元素,定义递归函数为前i-1个元素全排列已经排好, 将第i个元素以及后面的元素进行全排列。过程为从第i个元素到最后一个元素轮流放在第i个位置上, 然后对第i+1个元素以及后续元素进行全排列。

class Solution {
public:
    vector<vector<int>> permute(vector<int>& nums) {
        vector<vector<int>> res;
        permutehelper(nums, 0, res);
        return res;
    }

private:
    void permutehelper(vector<int>&nums, int l, vector<vector<int>> &res){
        if (l == nums.size()) {
            res.push_back(nums);}
       for (int i = l; i < nums.size(); i++) {
                swap(nums[l], nums[i]);
                permutehelper(nums, l+1, res);
                swap(nums[i], nums[l]);
            }

    }  

};

二. 大整数的乘法 leetcode43 MultiStrings

大整数的乘法分为两步, 第一步将第一个大整数乘以第二个大bit的每个位。 注意后面要补0, 第二个步将第一步的中间结果实现一个大数加法。

第一个trick。实现的时候用一个vector<int> 最后再统一处理进位和转成字符串。

class Solution {
public:
    string multiply(string num1, string num2) {
        if (num1 == "0" || num2 == "0") return "0";
        int len_1 = num1.size();
        int len_2 = num2.size();
        vector<string> holdMul;
        for (int i=0; i<len_2; i++){
            string tmp= "";
            tmp = num2[len_2 - 1 -i];
            string fillZero(i, ‘0‘);
            holdMul.push_back(mulOnebit(num1, tmp) + fillZero);
        }
        string sum=holdMul[0];
        for  (int j=1; j< holdMul.size(); j++) {
            sum = addStr(sum, holdMul[j]);

        }
        return sum;
    }

private:
    string addStr(string a, string b) {
        reverse(a.begin(), a.end());
        reverse(b.begin(), b.end());
        int i = 0;
        int j = 0;
        vector<int> result;
        while(i< a.size() && j < b.size()) {
           result.push_back((a[i++] - ‘0‘)  +  (b[j++] - ‘0‘));
        }
        while(i < a.size()) result.push_back(a[i++] - ‘0‘);
        while(j < b.size()) result.push_back(b[j++] - ‘0‘);
        string re =  convertNumber(result);
        return re;

    }
    string mulOnebit(string a, string b) {
        vector<int> result;
        for(int i=a.size() -1; i >= 0; i--){
            result.push_back((a[i] - ‘0‘) * (b[0] - ‘0‘));
            cout << result.back()<< " ";
        }
        string re = convertNumber(result);
        return re;

    }
    string convertNumber(vector<int> input) {

        int len = input.size();
        for(int i = 0; i < len; i++) {
            if (input[i] >= 10) {
                if (i < len - 1){
                input[i + 1] += (input[i] / 10);
                }
                else {
                   input.push_back(input[i] / 10);
                }
                input[i] %= 10;
            }
        }

        reverse(input.begin(), input.end());
        string result(input.size(), ‘0‘);
        for (int i=0; i< result.size(); i++) {
            result[i] += input[i];
        }

        return result;

    }

};

三. 完全二叉树如何高效插入

https://blog.csdn.net/fangjian1204/article/details/39179343

https://www.cnblogs.com/qieerbushejinshikelou/p/3917019.html

(1) O(n)的解法,采用一个queue层次遍历二叉树,取出来最右边的node插入

(2)   O(logn * logn)的解法,递归。判断左右子树的高度,若左子树h大于右子树的h,则在左子树里面找,否则在右子树里面找

TreeNode* getLastNode(TreeNode* root) {
           If (root == NULL || root ->left == NULL)  return root;
            int lh = 0;
            TreeNode* p = root;
            while(p) {
               lh++;
               p = p-> left;
          }
            Int rh = 0
             p = root;
             while(p) {
               rh++;
               p = p->right;
           }

           If (lh > rh) return getLastNode(root->left);
           else return getLastNode(root->right);
}

(3) O(logn)的方法

先统计树的深度,从右子树开始搜,一直向左搜到叶子结点,

如果右子树的深度 < 全树深,则回到左子树上搜索

否则如果搜到叶子结点对应的根结点没有右孩子, 则返回该叶子结点。

如果搜到的叶子结点对应的根结点有有孩子,则在右子树搜索。

TreeNode* getLastNode(TreeNode* root) {

          If (root ==NULL || root->left == NULL) return root;
          int height =0;
          TreeNode*p = root;
          while(p) {
              height++;
              p = p->next;
         }
         int level = 0;
         while(root) {
                 level++;
                 If (level == height) break;  // 右子树为空的情况。
                If (root->right) {
                Int tmp_len = level;
                 p = root;
                TreeNode *leaf = root->right;
                      while(leaf) {
                             tmp_len++;
                             p = leaf;
                            leaf = leaf ->left;
                      }
                     If (tmp_len < height)  root = root->left;
                     else if (p->right == NULL || p->right == leaf) return leaf;
                     else root = root->right;

              }
              else root = root->left;

         }
         return root;
}

四. 设计LRU

五. 在几亿个大小的数组中选出最大的k个数字

六. 单链表排序 leetcode 146

class Solution {
public:// 归并排序 找中点
    ListNode* sortList(ListNode* head) {
        if(head == NULL || head->next == NULL) return head;
        ListNode* slow = head;
        ListNode* fast = head;
        while(fast->next && fast->next->next) {
            fast = fast->next->next;
            slow = slow->next;
        }

        fast = slow->next;
        if(slow->next)
        slow->next = NULL;
        ListNode* l1 = sortList(head);
        ListNode* l2 = sortList(fast);
        return merge(l1, l2);
    }
private:
    ListNode* merge(ListNode* p1, ListNode* p2) {
        ListNode* p0 = new ListNode(0);
        if(p1 == NULL) return p2;
        if(p2 == NULL) return p1;
        ListNode* p = p0;
        while(p1 || p2) {
            int temp1 = (p1 == NULL ? INT_MAX : p1->val);
            int temp2 = (p2 == NULL ? INT_MAX : p2->val);
            if(temp1 <= temp2) {
                p->next = p1;
                p1 = p1->next;
                p = p->next;
            } else {
                p->next = p2;
                p2 = p2->next;
                p = p->next;
            }
        }
        /*if(p1){
            p->next = p1;
        }
        if(p2){
            p->next = p2;
        }*/
        return p0->next;
    }
};

七. 合并两个有序链表

class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        if (l1 == NULL) return l2;
        if (l2 == NULL) return l1;
        ListNode * head = new ListNode(0);
        ListNode * p = head;
        while (l1 != NULL && l2 != NULL) {
            if (l1->val <= l2->val) {
                p->next = l1;
                l1 = l1->next;
            }
            else {
                p->next = l2;
                l2 = l2->next;
            }
            p = p->next;
        }
        if (l1) {
            p->next = l1;
        }
        if (l2) {
            p->next = l2;
        }
        ListNode * tmp = head->next;
        delete head;
        return tmp;
    }
};

八. 青蛙跳

问跳到第n个台阶有几种跳法

每次跳一步或者两步

lass Solution {
public:
    int jumpFloor(int number) {
        if (number == 0) return 0;
        if (number == 1) return 1;
        if (number == 2) return 2;
        int pre_1 = 1;
        int pre_2 = 2;
        int re;
        for (int i=3; i<=number; i++){
            re = pre_1 + pre_2;
            pre_1 = pre_2;
            pre_2 = re;
        }
        return re;
    }
};

每次可以跳n步

class Solution {
public:
    int jumpFloorII(int number) {

         vector<int> record(number+1, 0);
         record[0] =1;
         for (int i = 1; i<= number; i++){
             for(int j=0; j< i; j++)
                 record[i] += record[j];
         }

        return record[number];
    }
};

九. 输出矩阵的外围元素,类似剑指offer的顺时针打印矩阵

class Solution {
public:
    vector<int> printMatrix(vector<vector<int> > matrix) {
        vector<int> result;
        int m = matrix.size();
        if (m==0) return result;
        int n = matrix[0].size();
        if (n==0) return result;
        int start=0;
        while(start < m/2.0 && start < n/2.0) {
           printCircle(matrix, start, m, n, result);
           start++;
        }
        return result;
    }
// 先判断问题,拆成print Circle,
// 确定起点和终点的变化(看坐标,起点和终点的坐标和相同)
// 四个顺序,除了第一个,剩下的都是有条件的,并且要执行后一个必须要满足前面所有的条件。
private:
    void printCircle(vector<vector<int>> matrix, int start, int m, int n, vector<int> & result){
         int end_x = n - 1 - start;
         int end_y = m - 1 - start;
         // 从左到右
         for (int i = start; i <= end_x; i++)
         result.push_back(matrix[start][i]);
         // 从上到下
         if (end_y > start) {
             for (int i = start+1; i <= end_y; i++)
                 result.push_back(matrix[i][end_x]);
         }
         // 从右到左
         if (end_x - 1 >= start && end_y > start) {
             for (int i= end_x-1; i>=start; i--)
                 result.push_back(matrix[end_y][i]);
         }
         // 从下到上
        if (end_y - 1 > start && end_x -1 >= start) {
            for (int i= end_y - 1; i>= start+1; i--)
                result.push_back(matrix[i][start]);
        }
    }
};

大数组里某个数第一次出现的位置

八. 二叉树的前序,中序和后序序列的转换算法,有实现限制

九. 最短路径

十. 两行扫雷,给出第二行,判断第一行是不是有雷

十一. 公共子树的最进 O(h)

十二. 一维的max_pooling

十三.  生成矩阵

原文地址:https://www.cnblogs.com/cookcoder-mr/p/11129707.html

时间: 2024-08-01 14:10:57

面经准备-旷视的相关文章

主宰尖端技术产业升级,旷视剑指世界第一

近日,国内人工智能公司旷视科技(Face++)完成约为 4.6 亿美元的C 轮融资,由中国国有资本风险投资基金领投,蚂蚁金服.富士康集团战略投资,中俄基金.阳光保险集团.SK集团.渤海华美等参投,刷新了人工智能领域的投资记录.对拥有核心刷脸识别技术的旷视科技来说,这一轮巨额融资的完成也代表着其刷脸识别技术将加速延展至更多企业和行业,得到更为广泛的运用. 巨额融资背后是旷视深厚的AI技术内功 在刚刚结束的全球顶级计算机视觉竞赛MS COCO和Places中,旷视科技的团队击败微软谷歌和Facebo

ECCV 2018 | 旷视科技提出统一感知解析网络UPerNet,优化场景理解

全球计算机视觉三大顶会之一 ECCV 2018(European Conference on Computer Vision)即将于 9 月 8 -14 日在德国慕尼黑拉开帷幕.届时,旷视首席科学家孙剑博士将带领团队远赴盛会,助力计算机视觉技术的交流与落地.本文介绍了旷视科技被 ECCV 2018 所接收的一篇论文,该论文提出了一种用于场景理解的统一感知解析网络--UPerNet. 论文名称:<Unified Perceptual Parsing for Scene Understanding>

「杂谈」旷视科技新产品监视学生上课不是什么好事儿

旷视科技新产品监视学生上课不是什么好事儿! 9月2号,一张带有"MEGVII旷视"图标的视频监控图像在社交网络上疯传. 图中显示,两名在教室中的女生身边,显示出了相应的课堂行为数据,比如趴桌子.玩手机.睡觉.听讲.阅读.举手等等.伴随这张图,还有大量网友严厉的指责与质疑,认为这样的技术不应该出现在课堂中. 对于旷世科技公司的这种所谓的人工智能高科技视频监控技术进入课堂的做法或者说是想法,笔者观点鲜明:反对,反对这种无节操无底线完全不顾学生隐私的人工智能技术的做法.这是为了发展人工智能而

旷视俞刚跳槽腾讯:曾多次带队夺冠COCO,称看好腾讯的应用场景

昨天晚上,有同学在新智元小程序曝出一则惊人消息:旷视大佬俞刚加盟腾讯 PCG 光影研究室,引发不少吃瓜群众热议:  这则消息最早是在知乎曝出的,有网友提问:如何看待旷视 detection 组组长俞刚跳槽腾讯 PCG 光影研究室? 目前这个问题已经被浏览了超过 50 万次,可见关注度还是蛮高的.其中,一条"元峰"的回答获得高赞.他表示自己同在 CV 融资四小龙工作,且即将离职,并分享了自己的感想.他表示:前几年一套人脸识别算法能卖上千万,现在只有 40 万了.他还谈到了 AI 创业公司

2018旷视面试

一.数字组合 给定一个数组a,其中元素各不相同且都是0~9之间的数字. 给定一个数字n,要求用数组a中的数组组合出一个大于n的十进制数字来,要求组合出来的数字尽量少,数组a中的元素可以使用多次. 关键点: 大于n 这个问题没想到需要扫描两遍,扫描一遍只能得到等于n的数字. import java.util.*; import java.util.stream.Collectors; public class Main { Random r = new Random(0); int[] gener

ThunderNet :像闪电一样,旷视再出超轻量级检测器,高达267fps | ICCV 2019

论文提出了实时的超轻量级two-stage detector ThunderNet,靠着精心设计的主干网络以及提高特征表达能力的CEM和SAM模块,使用很少的计算量就能超越目前的one-stage detectors,在ARM平台也达到了实时性,GPU的速度更是达到267fps ? 来源:[晓飞的算法工程笔记] 公众号 论文: ThunderNet: Towards Real-time Generic Object Detection 论文地址:https://arxiv.org/abs/190

微信公众账号开发教程

微信公众账号开发教程 一.第1篇-引言 本文转载来自柳峰老师的博客,在这里非常感谢柳峰老师的分享和贡献! 内容方面,大概会涉及到: 1)前沿知识:微信公众帐号的分类.两种模式各自的特点和区别.开发模式的配置使用等: 2)API中各类消息的使用(我已经对api进行封装并打成了jar包,到时候会考虑分享出来): 3)微信公众帐号开发中的小技巧(如换行.通过代码发送表情.屏幕飘雪花.表情的接收识别.在Android和iOS上表现不一致等等): 4)与业务系统对接的方法(链接.短信等,除了技术讲解还会做

364家机构共办2017数博会,三大新思维指引新经济之战

2017年5月28日,为期四天的2017数博会落幕.在这四天里,来自美国.德国.英国.日本.俄罗斯.印度等20多个国家和地区,200多个城市近千家企业界代表和5万多名观展人员齐聚贵阳,围绕主题"数字引领经济新增长"展开交流,积极探索大数据发展未来. 本届数博会的"大"数据 在本届数博会最后一天的2017国际大数据产业博览成果新闻发布会上,组委会公布了一系列数据:据初步统计,本届数博会共对接企业1479家,其中500强企业112家,达成签约意向项目235个,意向金额2

人脸识别(face recognition)

一.前述 1. 发展 以往的人脸识别主要是包括人脸图像采集.人脸识别预处理.身份确认.身份查找等技术和系统.现在人脸识别已经慢慢延伸到了ADAS中的驾驶员检测.行人跟踪.甚至到了动态物体的跟踪.由此可以看出,人脸识别系统已经由简单的图像处理发展到了视频实时处理.而且算法已经由以前的Adaboots.PCA等传统的统计学方法转变为CNN.RCNN等深度学习及其变形的方法.现在也有相当一部分人开始研究3维人脸识别识别,这种项目目前也受到了学术界.工业界和国家的支持. 之后的内容主要参考了下面的链接,