原文作者:aircraft

原文链接:https://www.cnblogs.com/DOMLX/p/11209807.html

一套面试题的目录在此,还在继续完善中。。。。。。

c/c++ 2019面试题目录

一.1道网易c++的面试题

我当时第一时间的解答方案

#include <iostream>
#include <vector> using namespace std; int main()
{
const int Wi = 3840;
const int Hi = 2160;
int N,M;
int temp;
int x,y,w,h;
int x1,y1;
int b;
vector<vector<int> > Windows(0, vector<int> (4));
vector<int> Window;
vector<vector<int> > pos(0, vector<int> (2));
vector<int> po;
vector<int> nums;
vector<int> SX;
cin >> N >> M;
if(N<=0 || M >= 1000) return 0;
for(int i = 0;i < N;i++){
SX.emplace_back(N-i);
cin>>x>>y>>w>>h;
Window.emplace_back(x);
Window.emplace_back(y);
Window.emplace_back(w);
Window.emplace_back(h);
Windows.emplace_back(Window);
Window.clear();
} for(int j = 0; j < M; j++){
cin>>x1>>y1;
po.emplace_back(x1);
po.emplace_back(y1);
pos.emplace_back(po);
po.clear();
}
for(int k = 0; k < M; k++){
int flag = -1;
for(int i = 0; i < N; i++){
if(flag = -1)
if(Windows[SX[i] - 1][0] <= pos[k][0] && (Windows[SX[i] -1][0]+Windows[SX[i] -1][2])>=pos[k][0] && Windows[SX[i]-1][1] <= pos[k][1] && (Windows[SX[i]-1][1]+Windows[SX[i]-1][3])>=pos[k][1]){
flag = SX[i];
int size = SX.size();
for(int j = i - 1; j >= 0 ;j--){
SX[j + 1] = SX[j];
}
SX[0] = flag;
break;
} }
nums.emplace_back(flag);
flag = -1;
}
for(auto num:nums){
cout<<num<<endl;
}
}

二.环形链表

给定一个链表,判断链表中是否有环。

为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos-1,则在该链表中没有环。

示例 1:

输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。

示例 2:

输入:head = [1,2], pos = 0
输出:true
解释:链表中有一个环,其尾部连接到第一个节点。

示例 3:

输入:head = [1], pos = -1
输出:false
解释:链表中没有环。

进阶:

你能用 O(1)(即,常量)内存解决此问题吗?

我的代码:20ms

/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
bool hasCycle(ListNode *head) {
if(head == NULL) return false;
unordered_map<ListNode*,int> umap;
ListNode *node = head;
while(node->next != NULL){
umap[node]++;
if(umap[node] > ) return true;
node = node->next; }
return false;
}
};

我的思路就是把每个链表遍历存储在map容器中,出现已经存放的地址时申请再次存放时,这时候就是环形链表。

大佬们的代码5ms左右:

class Solution {
public:
bool hasCycle(ListNode *head) {
if(head == NULL)
return false;
ListNode *slow,*fast;
slow = head;
fast = head;
while(slow && fast)
{
slow = slow->next;
fast = fast->next;
if(fast)
fast = fast->next;
else
return false;
if(slow == fast)
return true;
}
return false;
}
};

这个代码思路就是快慢指针,如果链表出现环形,那么我的快慢指针一定会相遇。

3.二叉树的最大深度:

给定一个二叉树,找出其最大深度。

二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。

说明: 叶子节点是指没有子节点的节点。

示例:
给定二叉树 [3,9,20,null,null,15,7]

    3
/ \
9 20
/ \
15 7

返回它的最大深度 3

我的代码:16ms

/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int count = ;
int max = ;
int maxDepth(TreeNode* root) {
if(root == NULL) return ;
count++;
if(count > max) max = count;
maxDepth(root->left);
maxDepth(root->right);
count--;
return max;
}
};

我的思路就是全部遍历一遍,记录最大深度。

大佬的代码:4ms

/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public: int detectDepth(TreeNode* node) {
if (!node) return ;
int leftDepth = + detectDepth(node -> left);
int rightDepth = + detectDepth(node -> right);
return std::max(leftDepth, rightDepth);
} int maxDepth(TreeNode* root) {
return detectDepth(root);
}
};

这个代码就是跟我的思路差不多,不过用递归的方法优化,比我好多了。

4.验证二叉搜索树

给定一个二叉树,判断其是否是一个有效的二叉搜索树。

假设一个二叉搜索树具有如下特征:

  • 节点的左子树只包含小于当前节点的数。
  • 节点的右子树只包含大于当前节点的数。
  • 所有左子树和右子树自身必须也是二叉搜索树。

示例 1:

输入:
2
/ \
1 3
输出: true

示例 2:

输入:
5
/ \
1 4
  / \
  3 6
输出: false
解释: 输入为: [5,1,4,null,null,3,6]。
  根节点的值为 5 ,但是其右子节点值为 4 。 我的代码24ms
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
bool flag = ;
int ergodic(TreeNode* root,long min,long max){
if(root == NULL) return ;
if(root->left != NULL){
if(root->left->val >= root->val || root->left->val <= min){
flag = ;
return ;
}
ergodic(root->left,min,root->val);
}
if(root->right != NULL){
if(root->right->val <= root->val || root->right->val >= max){
flag = ;
return ;
}
ergodic(root->right,root->val,max);
}
return ;
}
bool isValidBST(TreeNode* root) {
if(root == NULL) return ;
if(root->left != NULL){
if(root->left->val >= root->val){
flag = ;
return ;
}
ergodic(root->left,LONG_MIN,root->val);
}
if(root->right != NULL){
if(root->right->val <= root->val){
flag = ;
return ;
}
ergodic(root->right,root->val,LONG_MAX);
} return flag;
}
};

我的方法就是递归遍历加上数值判断

大佬的代码:8ms

/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
bool isValidBST(TreeNode* root, long long min = LONG_LONG_MIN, long long max = LONG_LONG_MAX) {
if(root == NULL) return true;
if(root->val <= min || root->val >= max) return false; return isValidBST(root->left, min, root->val) && isValidBST(root->right, root->val, max);
}
};

这个代码其实思路是跟我差不多的,但是代码的简洁和调用库函数来判断,比我那乱七八糟的好太多了。

5.对称二叉树

给定一个二叉树,检查它是否是镜像对称的。

例如,二叉树 [1,2,2,3,4,4,3] 是对称的。

    1
/ \
2 2
/ \ / \
3 4 4 3

但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:

    1
/ \
2 2
\ \
3 3

说明:

如果你可以运用递归和迭代两种方法解决这个问题,会很加分。

我的代码:8ms

/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int flag = ;
int left = ;
int right = ;
vector<int> leftTree,rightTree;
void leftRecursiveComparison(TreeNode* root){
if(root){
left++;
leftRecursiveComparison(root->left);
leftTree.emplace_back(root->val);
leftRecursiveComparison(root->right);
}
else leftTree.emplace_back(left);
}
void rightRecursiveComparison(TreeNode* root){
if(root){
right++;
rightRecursiveComparison(root->right);
rightTree.emplace_back(root->val);
rightRecursiveComparison(root->left);
}
else rightTree.emplace_back(right);
}
bool isSymmetric(TreeNode* root) {
if(root == NULL) return true;
leftRecursiveComparison(root->left);
rightRecursiveComparison(root->right);
int lenLeft = leftTree.size();
int lenRight = rightTree.size();
if(lenLeft != lenRight) return false;
for(int i = ; i < lenLeft; i++){
cout<<rightTree[i];
if(leftTree[i] != rightTree[i])
return false;
} return true;
}
};

我的思路已经不想讲了 ,直接看大佬的吧。

大佬们的代码:1ms左右

class Solution {
public:
bool isSymmetric(TreeNode* root) {
if(root==nullptr) return true;
return helper(root->left,root->right);
}
bool helper(TreeNode* left,TreeNode* right){
if(left==nullptr&&right==nullptr) return true;
if(left==nullptr||right==nullptr) return false;
return (left->val==right->val)&&helper(left->left,right->right)
&&helper(left->right,right->left);
}
};

大佬这个就是同时对两边的子树进行递归遍历,然后需要对称的值进行判断。

哎,看看自己跟大佬们的代码就知道差距了QAQ................

若有兴趣交流分享技术,可关注本人公众号,里面会不定期的分享各种编程教程,和共享源码,诸如研究分享关于c/c++,python,前端,后端,opencv,halcon,opengl,机器学习深度学习之类有关于基础编程,图像处理和机器视觉开发的知识

c++ LeetCode (网易面试题和链表以及树篇) 五道算法例题代码详解(三)的更多相关文章

  1. c++ LeetCode (初级字符串篇) 九道算法例题代码详解(二)

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/11089327.html 已经刷了很多篇leetcode题了,不过最近在找c++的实习工作(大佬 ...

  2. c++ LeetCode(初级数组篇)十一道算法例题代码详解(一)

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/10940636.html 唉!最近忙着面试找实习,然后都是面试的很多是leetcode的算法题, ...

  3. (转)面试题--JAVA中静态块、静态变量加载顺序详解

    public class Test { //1.第一步,准备加载类 public static void main(String[] args) { new Test(); //4.第四步,new一个 ...

  4. 转:web前端面试题合集 (Javascript相关)(js异步加载详解)

    1. HTTP协议的状态消息都有哪些? 1**:请求收到,继续处理2**:操作成功收到,分析.接受3**:完成此请求必须进一步处理4**:请求包含一个错误语法或不能完成5**:服务器执行一个完全有效请 ...

  5. Java面试题详解三:比较器

    一,Comparable和Comparator1.Comparable可以认为是一个内比较器,实现了Comparable接口的类有一个特点,就是这些类是可以和自己比较.Comparable接口中只有一 ...

  6. LeetCode 873. 最长的斐波那契子序列的长度 题目详解

    题目详情 如果序列 X_1, X_2, ..., X_n 满足下列条件,就说它是 斐波那契式 的: n >= 3 对于所有 i + 2 <= n,都有 X_i + X_{i+1} = X_ ...

  7. Leetcode:面试题 04.03. 特定深度节点链表

    Leetcode:面试题 04.03. 特定深度节点链表 Leetcode:面试题 04.03. 特定深度节点链表 先贴一下自己写过一个模板,按层数遍历: https://www.cnblogs.co ...

  8. 网易面试题:和为n连续正数序列

    题目: 输入一个正数n,输出所有和为n连续正数序列.例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以输出3个连续序列1-5.4-6和7-8. 继续做些题目,看到这是网易面试题,于是 ...

  9. 剑指Offer——网易笔试题+知识点总结

    剑指Offer--网易笔试题+知识点总结 Fibonacci package cn.edu.ujn.nk; import java.util.ArrayList; import java.util.S ...

随机推荐

  1. XAF Architecture XAF架构

    Applications built with the eXpressApp Framework are comprised of several functional blocks. The dia ...

  2. UiPath Platform注册 登录 及 访问 Orchestrator

    相关步骤: 1.https://platform.uipath.com/portal_/cloudrpa 注册 及 登录 2. Login后 通过Services 连接 访问 UiPath Orche ...

  3. Jenkins工程中SQL语句执行的方法

    前言 网上很多jenkins工程中基于shell或批处理方式调用sql文件执行sql命令的方式,大部分都是需要基于sql文件来完成的,因此在sql语句发生变化时需要去jenkins服务端修改对应的sq ...

  4. Android进程管理机制研究

    一.Linux中的进程管理在Linux中,进程是指处理器上执行的一个实例,可使用任意资源以便完成它的任务,具体的进程管理,是通过“进程描述符”来完成的,对应Linux内核中的task_struct数据 ...

  5. 利用keras自带房价数据集进行房价预测

    import numpy as np from keras.datasets import boston_housing from keras import layers from keras imp ...

  6. Spring Boot中使用Swagger2构建强大的RESTful(最新全,无坑)

    1:说明 网上这类文章 太多, 一搜一大把 ,但是要不是知识太过于老旧,就是配置没有说名清楚,你的项目按照他的配置却不能正常运行: 所以本文的目的: 配置swagger 2  那swagger 1 不 ...

  7. 搭建自己的企业级镜像仓库-Harbor

    网上资料很多,在这记录一下思路 1 安装Docker 2 安装Docker Compose apt-get install docker-compose3 下载最新版Harbor在线安装包,例如 ha ...

  8. Redis 实现美团的外卖派单系统“附近的人”筛选实战原理分析

    针对“附近的人”这一位置服务领域的应用场景,常见的可使用PG.MySQL和MongoDB等多种DB的空间索引进行实现.而Redis另辟蹊径,结合其有序队列zset以及geohash编码,实现了空间搜索 ...

  9. ASP.NET MVC快速开发框架FastExecutor开发全过程感受及总结

    困境 追溯到2018年5月份,是个炎热的夏天,毕业后1年7个月我提出了离职,原因是受不了原来公司过度的封装框架感觉一年多毫无进步与实施天天轰炸般的电话,偶然间出去面试了一次发现自己知识真的是比较局限, ...

  10. 设置tabBar的图片/高度/title颜色

    实现了一下内容: 1.设置tabBarItem选中及非选中时的图片,图片充满item; 2.调整了 tabBar 高度; 3.改变了title颜色及位置. ------------代码如下: ---T ...