微软算法面试题(2021最新)

21 篇文章 0 订阅
15 篇文章 0 订阅

今天,约了微软的面试,连续三轮,每轮1个小时,从下午2点持续到下午5点。虽然感觉自己最后一轮回答的非常烂,但是还是把面试过程分享出来,给大家一些参考吧

第一轮:自我介绍+项目介绍
开始做题: 合并k个链表
解题思路:两两合并(考查分治方法)

第二轮:自我介绍+项目介绍
开始做题: 1. 如何判断一颗平衡树 2. 颜色分类(0,1,2按序排列)
题1解题思路:采用递归,判断子树是否是一颗平衡树(如果是,返回子树高度;如果不是返回-1)
题2解题思路:LeetCode原题,采用双指针

第三轮:自我介绍+项目介绍
开始做题: 1. 实现单例模式 2. String转数字,若存在特殊字符,返回null, 否则返回数字(考虑正负情况)
题1解题思路:使用静态内置类实现单例模式(饿汉模式)

    public class Singleton {    //可通过类来获取静态变量
	    private static Singleton instance = new Singleton();    //初始化自动创建实例,static和private修饰
	    private Singleton (){}    //避免构造函数
	    public static Singleton getInstance() {    //获取实例方法,public公开方法,static修饰静态方法
	    	return instance;    
	    }  
	}

题2解题思路:需要考虑各种特殊情况,主要考察你对问题的考虑是否周到

  1. 是否为空,或者由空格组成。

  2. 是否带有正负符号,正号可以忽略,负号在返回结果时需要带上。

  3. 以0开头,需要跳过连续的前置0。例如"000123",转换的结果是123。

  4. 超过了Integer的最大边界或最小边界。

  5. 小数点可以忽略,因为是转成整型,会舍掉小数点后面的数。

  6. 出现多个正负符号,直接返回0。例如"±2",结果是0。

  7. 第一位只能是数字(0到9)或者正负符号,出现其他字符直接返回0。

public int myAtoi3(String str) {
    if (str == null) {
        return 0;
    }
    str = str.trim();
    if (str.isEmpty()) {
        return 0;
    }
    int index = 0, total = 0, n = str.length();
    int sign = 1;
    // 判断正负
    // 只判断一次,不能使用循环
    if (index < n && (str.charAt(index) == '+' 
            || str.charAt(index) == '-')) {
        sign = str.charAt(index) == '-' ? -1 : 1;
        index++;
    }
    // 计算整数
    while (index < n) {
        int num = str.charAt(index)-'0';
        if (num < 0 || num > 9) {
            break;
        }
        // 避免越界
        if (total > Integer.MAX_VALUE/10 || 
                (total == Integer.MAX_VALUE/10 
                && num > Integer.MAX_VALUE%10)) {
            return sign == 1 ? Integer.MAX_VALUE : Integer.MIN_VALUE;
        }
        total = total*10 + num;
        index++;
    }
    return total*sign;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值