微软面经刷题

本文详述了多个数据结构和算法问题,包括数组中的第K个最大元素、二分查找、二叉树的最大路径和、LRU缓存等。还涉及链表操作、数组操作、字符串处理、数独判断等多个编程挑战,是准备面试的宝贵资源。
摘要由CSDN通过智能技术生成

数组中的第K个最大元素(medium)

在这里插入图片描述
题解用了快排和堆排,我直接用了sort函数

class Solution {
   
public:
    int findKthLargest(vector<int>& nums, int k) {
   
        sort(nums.begin(),nums.end(),greater<int>());
        return nums[k - 1];
    }
};

未解

第一题是给一个字符串,判断这个字符串是不是一个合法的64bits无符号整数
第二题是给n个有序链表,找出在n个链表中出现在至少m个链表中的数
给一个入栈的序列中间可以随便出栈,求一共有多少种出栈序列的可能(e.g. [1,2,3] -> 5)
第二道是给出两两认识的人要求给所有人分组
获取Excel的StringHeader,就是输入1输出A,输入26输出Z,输入27输出AA这种
一个整数数组(可能有负数),求两个没有交集的连续区间内所有数字的最大的和
从一个超级大的文本中随机取出k行,怎么取?
寻找一颗二叉树最后一层最左边的节点(DFS BFS)
1, 输入年月日,输出该天为该年的第几天,
2, 输入一个数组和一个整数,问这个数组相邻元素之间相加减,可否得到目标整数

  1. 给一个句子,按单词做反转(比如l love MS 翻转为 MS love I)
    2, 旋转的有序数组,找指定的字符(只用返回能否)
    3, 给定一个数组,再给一个目标值,问是否有两个值的和为目标值(只用返回能否)
    给定一个整数数组,求出该整数数组能拼接得到的最大整数
    题目是把中文数字转换成double值,比如“二零一二” -> 2012
    “三十万七百亿四千零八十一千零五十五” -> 30070040081035
    1 循环队列 2. IPv4 + String To Int 3. 有效excel表格
    二维平面上有若干个点,求出所有欧氏距离和曼哈顿距离相等的节点对数。
  2. 给定一个无序数组,找到三个数使得乘积最大
  3. 给一篇文章,找出词频最大的十个单词
  4. 计算器只支持-1操作和*2操作,初始值x和目标值y,最少通过几步可以从x到y
  5. 给定一个链表A,要求在A的第i到j位置中间插入B链表
  6. 给定一个二维数组matrix,每一步的代价是两个位置数字的差的绝对值,求从左上角到右下角的最小代价

环形数组是否存在循环

无重复字符串的排列组合

有重复字符串的排列组合

顺时针旋转矩阵

LRU 缓存

二叉树中的最大路径和

class Solution {
   
private:
    int ans=INT_MIN;
public:
    int maxNodeGain(TreeNode* root)
    {
   
        if(root==nullptr)
            return 0;
        int left = max(0,maxNodeGain(root->left));
        int right = max(0,maxNodeGain(root->right));
        int maxNodePath = left + right + root->val;
        ans = max(ans,maxNodePath);
        return max(left,right)+root->val;
    }
    int maxPathSum(TreeNode* root) {
   
        maxNodeGain(root);
        return ans;
    }
};

二分查找

判断二分图

数组中重复的数据

礼物的最大价值

全排列II

设计循环队列

重建二叉树

class Solution {
   
private:
    unordered_map<int, int> index;

public:
    TreeNode* myBuildTree(const vector<int>& preorder, const vector<int>& inorder, int preorder_left, int preorder_right, int inorder_left, int inorder_right) {
   
        if (preorder_left > preorder_right) {
   
            return nullptr;
        }
        
        // 前序遍历中的第一个节点就是根节点
        int preorder_root = preorder_left;
        // 在中序遍历中定位根节点
        int inorder_root = index[preorder[preorder_root]];
        
        // 先把根节点建立出来
        TreeNode* root = new TreeNode(preorder[preorder_root]);
        // 得到左子树中的节点数目
        int size_left_subtree = inorder_root - inorder_left;
        // 递归地构造左子树,并连接到根节点
        // 先序遍历中「从 左边界+1 开始的 size_left_subtree」个元素就对应了中序遍历中「从 左边界 开始到 根节点定位-1」的元素
        root->left = myBuildTree(preorder, inorder, preorder_left + 1, preorder_left + size_left_subtree, inorder_left, inorder_root - 1);
        // 递归地构造右子树,并连接到根节点
        // 先序遍历中「从 左边界+1+左子树节点数目 开始到 右边界」的元素就对应了中序遍历中「从 根节点定位+1 到 右边界」的元素
        root->right = myBuildTree(preorder, inorder, preorder_left + size_left_subtree + 1, preorder_right, inorder_root + 1, inorder_right);
        return root;
    }

    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
   
        int n = preorder.size();
        // 构造哈希映射,帮助我们快速定位根节点
        for (int i = 0; i < n; ++i) {
   
            index[inorder[i]] = i;
        }
        return myBuildTree(preorder, inorder, 0, n - 1, 0, n - 1);
    }
};

二叉树的直径

把数字翻译成字符串

最长回文子串

#include <iostream>
#include <string>
#include <vector>

using namespace std;

class Solution {
   
public:
    string longestPalindrome(string s) {
   
        int n = s.size();
        if (n < 2) {
   
            return s;
        }

        int maxLen = 1;
        int begin = 0;
        // dp[i][j] 表示 s[i..j] 是否是回文串
        vector<vector<int>> dp(n, vector<int>(n));
        // 初始化:所有长度为 1 的子串都是回文串
        for (int i = 0; i < n; i++
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值