华为后端开发暑期实习生一面
1.自我介绍
2.手撕 “查找单词” (类似这道https://leetcode-cn.com/problems/word-search/)
3.引用的概念,回到我的代码中为什么不用引用
4.讲一下多态,虚函数表存在什么位置,父类子类构造函数和析构函数的先后顺序
5.内存中堆和栈的概念,区别。在函数中定义一个10亿个字节的数组,会怎么样 (预先分配还是栈分配)
6.如果是new一个数组,离开作用域栈会自动析构吗?
7.vector的原理,一直push会怎么样(扩容);vector 和 list 怎么选择
8.map内部是什么实现,分析一下和AVL树的优势和劣势
9.Linux进程和线程的概念
10.围绕简历中的比赛,怎么做死锁判断和避免死锁
11.Linux环境怎么调试
反问:有没有什么问题。。。。全程一个小时结束
手撕代码
/* 查找单词 给一个n行m列的字符串数组,找是否存在给定str,可以相邻找(上下左右) 输入:第一行n m; 第二行 str; 接下来是n行长度为m的string 输出:"YES" 、"NO" 样例: 3 3 su qwu asd zuc 输出 YES */ #include <iostream> #include <vector> #include <string> using namespace std; bool dfs(vector<string> &vec, string &str, int i, int j, int curindex) { bool flag = false; if(vec[i][j] == str[curindex]) { if(curindex + 1 == str.size()) return true; if(!flag && i - 1 >= 0) { flag = dfs(vec, str, i - 1, j, curindex++); } if(!flag && i + 1 < vec.size()) { flag = dfs(vec, str, i + 1, j, curindex++); } if(!flag && j - 1 >= 0) { flag = dfs(vec, str, i, j - 1, curindex++); } if(!flag && j + 1 < vec[0].size()) { flag = dfs(vec, str, i, j + 1, curindex++); } } return flag; } int main() { int n, m; cin >> n >> m; string str; cin >> str; vector<string> vec; for(int i =0; i < n; i++){ string s; cin >> s; vec.push_back(s); } bool tmp = false; for(int i = 0; i < n; i++) { for(int j = 0; j < m; j++) { tmp = dfs(vec, str, i, j, 0); if(tmp == true) { cout << "YES"; return 0; } } } cout << "NO"; return 0; }