个人秋招流程3-常见面试题

其他代码:

  1. 螺旋打印,倾斜打印数组
  1. 矩阵乘法
  2. O(1)空间判断整数是否为回文数字 (负数;直接翻转会溢出) => 思路具体如何取? 取最高位,最低位后; 在删除最高位最低位
  3. 矩形中1的个数(连通集 & 正方形分别如何做?)
  4. 打印所有的子集
  5. 买卖股票 1次?dp[i]当前位置的最小值 dp[i] = dp[i-1] or prices[i]
  6. 买卖股票 多次?当前为止的最大利润 dp[i] = dp[i-1]+prices[i]-prices[i-1] or dp[i-1]
  7. 买卖股票 dp[k, i] = max(dp[k, i-1], prices[i] - prices[j] + dp[k-1, j-1]), j=[0…i-1]
    第K手交易的= 不做交易的前一天的收益; 在[0,i-1]天中的某一个收益上增加一手交易
  1. 最长公共子序列 dp[i][j] = std::max(dp[i-1][j], dp[i][j-1])
  2. 最长上升子序列 两个for循环,dp[i]=max{1,dp[j]+1},遍历j<i情况
  3. 大数乘法???
  4. 最长不重复的连续子串 (slow,fast之间是不重复的区间 + fast:遇到之前出现过的字符,则移动slow到此字符出现的位置 思考:如何实现的?开辟256大小的空间存储value-index对)
  1. 位运算: 只出现1次,其他出现2次 (数组内逐元素异或)
  2. 位运算: 两个数字出现1次,其他出现两次 (1.寻找逐元素异或,寻找为1的index 2.划分数组后转化为问题12)
  3. 位运算: 只出现1次,其它出现3次 (二进制每一位统计1的个数 % 3, 余数即为所求)
  4. 位运算: 只出现2次,其他出现1次 ?(1~100的数字,有一个出现2次。 异或1~100自己异或 ^ 包含101个数字的数组异或 || 1.hash表 || 2.sum求和 )
  5. 位运算: 不使用加减法做加法? 剑指offer 47
  6. 位运算: 数字中1的个数 思路: 1.考虑正负数 2.最优解法:
  1. while(K){ //每次把K的最右侧第一个1置位0
    ++count;
    K = K & (K-1);
    }

  2. 二叉树判断问题:

  1. 对称树 辅助函数,helper(left->left,right->right) && helper(left->right,right->left);
  2. 平衡二叉树 1.辅助函数计算树深 2.或者类似后续遍历的递归写法 left递归,right递归,判断left-right的差值,return max(left,right)+1
  3. 子树 1.helper先判断两个树是否相同 2.原函数递归判断A->left,B || A->right,B
  1. 二叉树的创建问题:
  1. 镜像树
  2. 前序遍历带# 类似于前序遍历的流程,TreeNode* build(vector&arr,int& index)
  3. 前序&中序
  1. 二叉树的路径问题:
  1. 最大深度 4行
  2. 最大直径 类似后续遍历,root节点处理左右子树和
  3. 路径和 pathSum(TreeNode* root, int target, vector&path,vector<vector>& ans)
  4. 最近公共父节点
  1. 二叉搜索树问题:
  1. 二叉搜索树的最近公共父节点 参数: TreeNode* root,p,q
  2. 第K小的值
  3. 每一个节点的val修改为所有大于其的和
  1. 两个数组交集(有序:归并排序 无序:hashmap,另一个数组做查找)

  2. 二分查找(
    1.开平方while(|mid^2-target|>ξ)
    2.有序数组第一个等于K的值,最后一个等于K的值 等于K的判断条件放在while(low<=high)最后
    3.有序数组第一个大于等于K的值
    4.旋转数组寻找旋转点,寻找K值
    5.二分法: 牛顿迭代法:while(xn^2-num>ξ) {xn+1 = xn - f(xn)/f’(xn)} 其中:f(xn)=x^2-2
    6.牛顿法 ==> f(xn+1) = f(xn) + f’(xn)*(xn+1 - xn) = 0

  3. 满二叉树(节点是满的),完全二叉树(最后一层空缺,只能空缺在右边)==>完全二叉树的最后一个节点

  4. 二叉树中序遍历的下一个节点(有指向父节点的指针); 二叉树的叶子节点的公共父节点

  5. 后缀数组 字符串中子串出现最多的次数 ???

  6. 寻找明星的策略(群众之间的关系未知,智力题 去看BAT100题)

  7. 图的最短路径算法
    1)Floyd算法
    邻接矩阵=i,j的最短距离
    第一重for循环遍历中间节点K∈(0,N); 两重循环更新edge[i][j]>如果可达,更新Edge[i][j]=min(self,edge[i][k]+edge[k][j])
    2)Dijkstra算法
    加权无向图
    单源最短路径,邻接链表
    mark[] 表示节点是否存在于s的最短路径集合中; mark
    true,dist[]是最短路径。 否则 distp[i]表示s经过集合某个元素K再到达i的距离
    1.遍历n-1个顶点 2.空集加入start节点 3.从所有不在集合中的节点,选择dist[]最短距离的newP
    2.S可达的最短路径集合中新加入的newP,更新其newP的邻接链表 可达点的dist[];
    3)Bellman-Ford
    加权(可负)有向图
    任意顺序放松有向图的所有边,重复V(顶点个数)轮
    4)拓扑排序
    无权重的有向图,不断删除入度为0的顶点。节点没删除完但是找不到入度为0时,存在环路

  8. 划分物品使得重量最相近(背包问题)

  9. 数据流的中位数 (最大堆 最小堆的堆顶保存中位数或者中位数两侧值)

  10. 二叉树: 路径和&路径II pathSum(root,sum,path,ans) 注意加入ans的判断位置;

  11. 二叉树: 两个节点的最远距离 == 树的直径 helper(TreeNode* root, int& diameter) diameter = std::max(diameter, ld+rd)

  12. 长度L的绳子最多覆盖坐标轴上多少点? fast,slow指针 (fast-slow<=L max_count,fast++;)否则slow++

  13. 字符串中最长的数字字符串 (DP? dp[i]=dp[i-1]+1 / 0)

  14. 堆排序的流程

  15. 数组旋转(先旋转给定点前K个元素 + 在旋转后面n-k个 + 再做整体旋转)

  16. 旋转的数组二分查找给定target

  17. 数组和等于目标值 hashmap

  1. int整数交换一次,使得数字尽可能最大(思路: 寻找递减区间的分界线 + 从分界线的右侧寻找"max" +分界线左边寻找小于"max"的最大值+ 交换)

/ BFS DFS
34. 小岛数量? (DFSHelper何时跳出循环? 传入哪些参数?) DFSMarking(vector<vector>& grid, int i, int j)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值