阿里3.15笔试题,通过一道

阿里

阿里3.15笔试情况:

楼主投的后端开发。

第一题:

  • 给出a,b,c三个数。

  • 现在我们可以通过某种操作,使a,b里头的任意一个二进制位发生翻转,0->1,1->0。

  • 最后我要通过 a | b的形式,使得 a与b或的结果为 c

  • 提问: 我最多要翻转几次?

输入数据:

第一行输入一个数T,告诉你有多少行

第二行至后续行,每一行输入abc,以逗号隔开

每个数最大不超过10的9次方

输入示例:

1
2 6 5

输出:

3

解释:

a = 2  0010
b = 6  0110
c = 5  0101

只需要翻转ab从右往左第二位1两次,最右边1次即可。这也是我做题的思路。

主要就是对c逐位移位,该位置上是0,就判断该位置上ab是0还是1的情况。
0 -》几个1加几次
1 -》都为0才加一次

本题为签到题,不难,很快拿下

第二题:

切割蜡烛;

  • 总共最多切割两次

  • 蜡烛长度为n 厘米,每分钟燃烧1厘米

  • 最多切割n-1厘米,最少1cm

  • 切割任意长度的概率均为 1 / (n-1)

  • 切割完以后,两根蜡烛同时燃烧。

  • 如果蜡烛最后剩下的长度>=2。需要重新像上边一样重新随机切割一次。这次切割以后,不再切割了。并且切割完以后,两根蜡烛同时燃烧。

  • 求总共的蜡烛燃烧的数学期望时间(单位:分钟)

  • 输出浮点数,保留4位精度

输入数据:

就一行,输入长度n,n最大不超过10的4次方

输入示例:

4

输出:

2.0000

思路:

看到10的4次方,直接就想暴力模拟了

1. 第一步new一个长度为n的数组fMinutes,记录第一次预计用时。从i = 1开始递增遍历此数组,i为切割的长度。那么预计用时就是Math.min(i, n-i);

2. 同时记录剩下的长度,这里没想起来用啥好,用了个拼音chazhi数组,chazhi[i] = Math.abs(i-(n-i)) = Math.abs(n-2 * i);

3. 接下来,new一个SMinutes数组,记录第一次加第二次的预计用时(数学期望)。

        -     如果长度剩下2或者1,那么SMinutes[j] = fMinutes[j] + 1,

        -     剩下0,就直接是SMinutes[j] = fMinutes[j]。

        -     剩下长度大于2,这里没想到好的方法,直接暴力了。。。


4. 最后把SMinutes里的元素全加起来,乘以 1 / (n-1)即可

最后两分钟做出来的时候本来挺开心,但是提交的时候一直报运行异常,编译不通过,说我import那里出问题了。。。由于时间所剩无几,也没时间debug了。遂放弃

贴一下我的代码,求大佬指教。由于没有提交成功,也不知道暴力会不会超时。我这个估计得算是O(n²)级别了

import java.io.*;
import java.util.*;


public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(new BufferedInputStream(System.in));
        double n = sc.nextDouble();

        double[] fMinutes = new double[(int)n];
        int[] chazhi = new int[(int)n];//其实就是剩下的长度;
        double[] SMinutes = new double[(int)n];

        for(int i = 1; i<=(n-1); i++){//i代表第一次切割,割的长度
            fMinutes[i] = Math.min(i,n-i);
            chazhi[i] = (int)Math.abs(2*i-n);
        }
        for(int i = 1; i<fMinutes.length; i++){
            if(chazhi[i] == 2 || chazhi[i] == 1)
                SMinutes[i] = fMinutes[i] + 1;
            else if(chazhi[i] == 0){
                SMinutes[i] = fMinutes[i];
            }
            else {
                //长度大于2
                double sum = 0.0;

                for(int j = 1; j<chazhi[i]; j++){
                    sum += Math.max(j,chazhi[i]-j) / (chazhi[i] - 1.0000);
                }
                SMinutes[i] = fMinutes[i] + sum;
            }
        }
        //计算最后的时间
        double ans = 0.0000;
        for(int i = 0; i<SMinutes.length; i++){
            ans += SMinutes[i] / (n - 1.0000);
        }

        String res = String.format("%.4f", ans);
        System.out.println(res);
    }
}

期望有个好结果。冲啊!

#阿里巴巴##Java工程师##实习##笔试题目##题解##笔经#
全部评论
好吧,自己本地测试了一下,估摸着应该是会超时了。。。
点赞 回复 分享
发布于 2021-03-15 22:14
能A出一道应该笔试就很稳了吧 起码不需要加试了。。
点赞 回复 分享
发布于 2021-03-17 20:33
想问一下楼主第一道题不是要a+b=c吗? 和a | b = c一个写法?
点赞 回复 分享
发布于 2021-03-21 13:11
最新情况,倒在技术终面了。哎,明天看看还有没有阿里部门愿意接收二志愿吧。要是不愿意接收就算了,搞到现在也有点累了,另外挑一个算了。说实话最想冲的还是阿里啊。。。
点赞 回复 分享
发布于 2021-03-31 11:24
刚做完今天的阿里面试题,ac了一道,第二题文艺平衡树,最后死活有个bug,无了。 问一下只过第一题可以过笔试吗😅
点赞 回复 分享
发布于 2021-04-09 20:11

相关推荐

1 14 评论
分享
牛客网
牛客企业服务