春招面试coding题汇总

微软一面
486. 预测赢家
给定一个表示分数的非负整数数组。 玩家 1 从数组任意一端拿取一个分数,随后玩家 2 继续从剩余数组任意一端拿取分数,然后玩家 1 拿,…… 。每次一个玩家只能拿取一个分数,分数被拿取之后不再可取。直到没有剩余分数可取时游戏结束。最终获得分数总和最多的玩家获胜。

给定一个表示分数的数组,预测玩家1是否会成为赢家。你可以假设每个玩家的玩法都会使他的分数最大化。

可以用递归、回溯或者动态规划。
先说简单的:
在这里插入图片描述
列举所有取的方法可以得到的先手和后手的分值差,以先手分数为正,后手分数为负,先手会选择让差值max的,后手会选择让差值min的,因为当前无法知道后面选择的情况,是先把后面的情况最优结果递归过来,再判断自己该返回哪种结果,这道题最终的输出值等于是判断先手有没有赢的可能性。

class Solution {
public:
    bool PredictTheWinner(vector<int>& nums) {
        return total(nums, 0, nums.size() - 1, 1) >= 0;
    }

    int total(vector<int>& nums, int start, int end, int turn) {
        if (start == end) {
            return nums[start] * turn;
        }
        int scoreStart = nums[start] * turn + total(nums, start + 1, end, -turn);
        int scoreEnd = nums[end] * turn + total(nums, start, end - 1, -turn);
        return max(scoreStart * turn, scoreEnd * turn) * turn;
    }
};

微软二面
1.返回树的左叶子节点之和(递归/非递归两种)笔记上一模一样
2.岛屿问题 dfs 曾经走过的地方可以用一个区别于1/0的数字表示
微软终面
前序遍历
层级遍历
按照单词翻转句子
智加一面
二分 默写模板了

智加二面
反转链表

习惯用栈来做,但他们更想要直接原地变换
1.创建一个newhead作为返回量,因为head移动到后面判断出来是空的时候,就返回不到前面一个节点了,就算判断head->next也需要一个head前一个节点的
2.每一次循环:
先记住head->next为nexx;
然后head的next指向head前一个的newhead
然后newhead变成head,等于往前走,
最后head变为nexx

class Solution {
public:
    ListNode* reverseList(ListNode* head) {

        ListNode* newhead=NULL;
        while(head!=NULL)
        {
            ListNode* nexx=head->next;
            head->next=newhead;
            newhead=head;
            head=nexx;
        }
        return newhead;
    }
};

阿里笔试
1.奖品争夺
共有n人,每人抽到一个初始序号a[i],如果某个人的序号是某个数的平方,那么他就会获奖,现在会发放一些数量的修改券,使用一张修改券可以使自己的序号加一或者减一,现在想知道,如果想让一半人可以获奖,至少需要发放多少张修改券?
输入描述:
第一行一个正整数,测试数据保证偶数,表示人数n;
第二行n个正整数,表示每个人的初始序号a[i]
输出描述:
一个正整数,表示至少需要发放的修改券。

2.卡牌
有n张卡牌,每张卡牌有两个属性,一个是攻击力a[i],一个是魔法消耗b[i],这n个卡牌按照顺序摆放,你需要找到三张卡牌,假设为i,j,k,需要满足(1<=i<j<k<=n,a[i]<=a[j]<=a[k]),你能否找到满足条件的而且b[i]+b[j]+b[k]最小,如果存在满足条件的3张卡牌,输出b[i]+b[j]+b[k]最小值,如果不存在输出-1.
输入描述:
第一行一个整数n(1<=n<=3000)
第二行n个整数为a(1<=a[i]<=100000)
第三行n个整数为b(1<=b[i]<=100000)
输出描述:
输出一行一个整数,如果满足条件是b[i]+b[j]+b[k]最小值,如果不存在输出-1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值