微软8.26笔试,这是想养一太平洋的鱼吗

三题感觉都不难,比上次简单。。。
第一题:给一个数,从中移除一个‘5’,求剩下的数的最大值。暴力即可。
import java.util.*;

public class Test01 {
    public static void main(String[] args) {
        Test01 s = new Test01();

        int N = -54325;
        int res = s.solution(N);
        System.out.println(res);
    }
    public int solution(int N) {
        int res = -1000000;
        HashSet<String> set = new HashSet<>();
        String sb = String.valueOf(N);
        for(int i = 0; i < sb.length(); ++i){
            char c = sb.charAt(i);
            if(c=='5'){
                String s = sb.substring(0,i)+sb.substring(i+1,sb.length());
                set.add(s);
            }
        }
        for(String s : set){
            res = Math.max(res, Integer.valueOf(s));
        }
        return res;
    }
}
第二题:给定数组A,返回和为0的子数组数目,子数组之间可以包含。前缀和+hash表。结果大于1e9返回-1.
import java.util.*;

public class Test02 {
    public static void main(String[] args) {
        Test02 s = new Test02();
        int[] A = new int[100000];
        for (int i = 0; i < A.length; i++) {

        }
        int res = s.solution(A);
        System.out.println(res);

    }
    public int solution(int[] A) {
        double res = 0;
        int n = A.length;
        int[] f = new int[n+1];
        for(int i = 1; i <= n; ++i){
            f[i] = f[i-1]+A[i-1];
        }
        HashMap<Integer, Double> map = new HashMap<>();
        for(int i = 1; i <= n; ++i){
            map.put(f[i], map.getOrDefault(f[i],0.0)+1);
        }
        for(int num : map.keySet()){
            double times = map.get(num);
            if(times>1){
                if(num==0){
                    res += times + times*(times-1)/2;
                }else{
                    res += times*(times-1)/2;
                }
                if(res > 1000000000) return -1;
            }
        }
        return (int) res;
    }
}
第三题:给定数组A,求长度大于2并且成等差数列的子数组个数,同样子数组之间可以包含。结果大于1e9返回-1.
差分数组,因为-2e9<=A[i]<=2e9,为了防止溢出,差分数组f取了double
public class Test03 {
    public static void main(String[] args) {
        Test03 s = new Test03();
        //int[] A = {(int)2e+9, (int)-2e+9, (int)2e9, (int)-2e+9, (int)2e9};
        int[] A = {0,1};
        //int[] A = new int[60000];
        
        int res = s.solution(A);
        System.out.println(res);
    }
    public int solution(int[] A) {
        double res = 0;
        int n = A.length;
        if(n < 3) return 0;
        double[] f = new double[n];
        f[0] = A[0];
        for(int i = 1; i < n; ++i){
            f[i] = (double)A[i]-(double)A[i-1];//记得强转double,否则按int算可能溢出
        }
        for(int i = 1; i < n-1; ){//注意差分数组从索引1开始
            if(f[i]==f[i+1]){
                int j = i+2;
                while(j<n && f[j]==f[i]){
                    j++;
                }
                double len = j-i;
                res += len*(len-1)/2;
                if(res > 1e9) return -1;
                i = j;
            }else{
                i++;
            }
        }
        return (int) res;
    }
}




#微软笔试#
全部评论
为啥第二题用double啊
1 回复 分享
发布于 2022-08-26 12:14 北京
第2题写错了,第27行不需要判断大于0,否则计算出错,如[2, -2, 3, 0, 2, -2]
3 回复 分享
发布于 2022-08-26 13:47 北京
不是今晚笔试吗?
1 回复 分享
发布于 2022-08-26 12:07 上海
微软貌似倾向于社招,不知道校招啥情况
2 回复 分享
发布于 2022-08-26 12:06 湖北
题怎么不一样
2 回复 分享
发布于 2022-08-26 21:26 陕西
可以看看我的内推贴,我们还有hc
1 回复 分享
发布于 2022-08-26 07:51 北京
微软简历筛选大概要多久啊…
点赞 回复 分享
发布于 2022-08-26 12:06 吉林
不知老兄对荣耀感不感兴趣,可以来试试。荣耀honor招聘官网https://www.hihonor.com/cn/career/ 内推码:yuhvad
点赞 回复 分享
发布于 2022-08-28 03:02 广东

相关推荐

13 60 评论
分享
牛客网
牛客企业服务