阿里巴巴笔试题选解

2023-05-16

阿里巴巴笔试题选解

                                                               --9月22日,阿里巴巴北邮站

小题:

1、有三个结点,可以构成多少种二叉树形结构?

2、一副牌52(去掉大小王),从中抽取两张牌,一红一黑的概率是多少?

编程题:

3、设计一个最优算法来查找一n个元素数组中的最大值和最小值。已知一种需要比较2n次的方法,请给一个更优的算法。情特别注意优化时间复杂度的常数。

4、已知三个升序整数数组a[l], b[m]和c[n]。请在三个数组中各找一个元素,是的组成的三元组距离最小。三元组的距离定义是:假设a[i]、b[j]和c[k]是一个三元组,那么距离为:

Distance = max(|a[ I ] – b[ j ]|, |a[ I ] – c[ k ]|, |b[ j ] – c[ k ]|)

请设计一个求最小三元组距离的最优算法,并分析时间复杂度。

5、在黑板上写下50个数字:1至50.在接下来的49轮操作中,每次做如下动作:选取两个黑板上的数字a和b,擦去,在黑板上写|b - a|。请问最后一次动作之后剩下数字可能是什么?为什么?

 

题解:(题解非官方,仅供参考,有错误的地方望指正!谢谢)

1、有三个结点的,可以构成多少个种二叉树形结构?

解:应该是5种;

 

2、一副牌52(去掉大小王),从中抽取两张牌,一红一黑的概率是多少?

考察概率论知识

解法一: 52张牌从中抽两张,就是 C(2,52)种情况,一红一黑是C(1,26) * C(1,26)种

    P = [C(1,26) * C(1,26) ] / C(2,52) = 26 * 26 / (26 * 51) = 26/51

解法二: 全为黑或者全为红是C(2,26)种情况,由于是黑和红两种,所以要乘以2

    P = 1 - C(2,26) / C(2,52) - C(2,26) / C(2,52) = 1 - 2 * (26 * 25)/(51 * 52) = 1 - 25/51 = 26/51

3、设计一个最优算法来查找一n个元素数组中的最大值和最小值。已知一种需要比较2n次的方法,请给一个更优的算法。情特别注意优化时间复杂度的常数。

解:把数组两两一对分组,如果数组元素个数为奇数,就最后单独分一个,然后分别对每一组的两个数比较,把小的放在左边,大的放在右边,这样遍历下来,总共比较的次数是 N/2 次;在前面分组的基础上,那么可以得到结论,最小值一定在每一组的左边部分找,最大值一定在数组的右边部分找,最大值和最小值的查找分别需要比较N/2 次和N/2 次;这样就可以找到最大值和最小值了,比较的次数为

      N/2 * 3 = (3N)/2 次

如图会更加清晰:

代码实现:

#include <stdio.h>
#include <stdlib.h>
#define N 7
int main()
{
    int arr[N] = {4, 1, 5, 9, 9, 7, 10};
    int iter = 0;
    int cnt = 0;
    for(iter = 0; iter < N  ; iter += 2)
    {
        if(++cnt && arr[iter] > arr[iter + 1] )
        {
            int temp = arr[iter];
            arr[iter] = arr[iter + 1];
            arr[iter + 1] = temp;
        }
    }
    int myMin = arr[0];
    for(iter = 2; iter < N ; iter += 2)
    {
        if(++cnt && arr[iter] < myMin)
        {
            myMin = arr[iter];
        }
    }
    int myMax = arr[1];
    for(iter = 3; iter < N; iter += 2)
    {
        if(++cnt && arr[iter] > myMax)
        {
            myMax = arr[iter];
        }
    }
    if(N % 2 != 0 && ++cnt && myMax < arr[N - 1]) myMax = arr[N - 1];
    printf("min is %d\n", myMin);
    printf("max is %d\n", myMax);
    printf("compare times is %d", cnt);
    return 0;
}

   上面的算法比较次数基本上已经是最优了,但是有朋友提出这样的顾虑,在极端的情况下,每次都做交换,可能会导致程序开销很大,这样的顾虑是对的,其实在上面的算法的基础上,可以不做交换就能找到最大值和最小值。

第3题  改进的算法:

  依旧把数组两两一组分配,不做交换操作,设置一个最大值Max和最小值Min,依次和每一组的两个数据做比较,把较大的值给Max,较小的值给Min,遍历一次就能找到数组的最大值和最小值。

  示例:数组为{(4, 1) , (5, 9) , (9 ,7)  ,(10,2)},经过第一组比较得到Max = 4,Min = 1,其中比较了3次;,经过第二组比较得到Max = 9,Min = 1,其中比较了3次;……到最后Max = 10,Min = 1;比较次数是3 * N/2 = (3N)/2,比较次数没有改变!代码实现不难,就不贴了

4、已知三个升序整数数组a[l], b[m]和c[n]。请在三个数组中各找一个元素,是的组成的三元组距离最小。三元组的距离定义是:假设a[i]、b[j]和c[k]是一个三元组,那么距离为:

Distance = max(|a[ I ] – b[ j ]|, |a[ I ] – c[ k ]|, |b[ j ] – c[ k ]|)

请设计一个求最小三元组距离的最优算法,并分析时间复杂度。

解:这道题目有两个关键点:

  第一个关键点: max{|x1-x2|,|y1-y2|} =(|x1+y1-x2-y2|+|x1-y1-(x2-y2)|)/2   --公式(1)

  我们假设x1=a[ i ],x2=b[ j ],x3=c[ k ],则

Distance = max(|x1 – x2|, |x1 – x3|, |x2 – x3|) = max(   max(|x1 – x2|, |x1 – x3|) , |x2 – x3|)   --公式(2)

  根据公式(1),max(|x1 – x2|, |x1 – x3|) = 1/2 ( |2x1 – x2– x3| +  |x2 – x3|),带入公式(2),得到

Distance = max( 1/2 ( |2x1 – x2– x3| +  |x2 – x3|) , |x2 – x3| )  

      =1/2 * max(  |2x1 – x2– x3|  , |x2 – x3| ) + 1/2*|x2 – x3//把相同部分1/2*|x2 – x3|分离出来

      =1/2 * max(  |2x1 – (x2 + x3)|  , |x2 – x3| ) + 1/2*|x2 – x3|   //把(x2 + x3)看成一个整体,使用公式(1)

      =1/2 * 1/2 *((|2x1 – 2x2| + |2x1 – 2x3|) + 1/2*|x2 – x3|

      =1/2 *|x1 – x2| + 1/2 * |x1 – x3| + 1/2*|x2 – x3|

      =1/2 *(|x1 – x2| + |x1 – x3| + |x2 – x3|)  //求出来了等价公式,完毕!

  第二个关键点:如何找到(|x1 – x2| + |x1 – x3| + |x2 – x3|) 的最小值,x1,x2,x3,分别是三个数组中的任意一个数,这一题,我只是做到了上面的推导,后面的算法设计是由csdn上的两个朋友想出来的方法,他们的CSDN的ID分别为 “云梦泽” 和 “ shuyechengying”.

算法思想是:

  用三个指针分别指向a,b,c中最小的数,计算一次他们最大距离的Distance ,然后在移动三个数中较小的数组指针,再计算一次,每次移动一个,直到其中一个数组结束为止,最慢(l+ m + n)次,复杂度为O(l+ m + n)

代码如下:

 

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define l 3
#define m 4
#define n 6
int Mymin(int a, int b, int c)
{
    int Min = a < b ? a : b;
    Min = Min < c ? Min : c;
    return Min;
}

int Solvingviolence(int a[], int b[], int c[])
{
    //暴力解法,大家都会,不用过多介绍了!
    int i = 0, j = 0, k = 0;
    int MinSum = (abs(a[i] - b[j]) + abs(a[i] - c[k]) + abs(b[j] - c[k])) / 2;
//    int store[3] = {0};
    int Sum = 0;
    for(i = 0; i < l; i++)
    {
        for(j = 0; j < m; j++)
        {
            for(k = 0; k < n; k++)
            {
                Sum = (abs(a[i] - b[j]) + abs(a[i] - c[k]) + abs(b[j] - c[k])) / 2;
                if(MinSum > Sum)
                {
                    MinSum = Sum;
//                    store[0] = i;
//                    store[1] = j;
//                    store[2] = k;
                }
            }
        }
    }
//    printf("the min is %d\n", minABC);
//    printf("the three number is %-3d%-3d%-3d\n", a[store[0]], b[store[1]], c[store[2]]);
    return MinSum;

}

int MinDistance(int a[], int b[], int c[])
{
    int MinSum = 0; //最小的绝对值和
    int Sum = 0;  //计算三个绝对值的和,与最小值做比较
    int MinOFabc = 0; // a[i] , b[j] ,c[k]的最小值
    int cnt = 0;  //循环次数统计,最多是l + m + n次
    int i = 0, j = 0, k = 0;  //a,b,c三个数组的下标索引
    MinSum = (abs(a[i] - b[j]) + abs(a[i] - c[k]) + abs(b[j] - c[k])) / 2;
    for(cnt = 0; cnt <= l + m + n; cnt++)
    {
        Sum = (abs(a[i] - b[j]) + abs(a[i] - c[k]) + abs(b[j] - c[k])) / 2;
        MinSum = MinSum < Sum ? MinSum : Sum;
        MinOFabc = Mymin(a[i] ,b[j] ,c[k]);//找到a[i] ,b[j] ,c[k]的最小值
        //判断哪个是最小值,做相应的索引移动
        if(MinOFabc == a[i])
        {
            if(++i >= l) break;
        }//a[i]最小,移动i

        if(MinOFabc == b[j])
        {
            if(++j >= m) break;
        }//b[j]最小,移动j
        if(MinOFabc == c[k])
        {
            if(++k >= n) break;
        }//c[k]最小,移动k

    }
    return MinSum;
}
int main(void)
{
    int a[l] = {5, 6, 7};
    int b[m] = {13, 14, 15, 17};
    int c[n] = {19, 22, 24, 29, 32, 42};

    printf("\nBy violent solution ,the min is %d\n", Solvingviolence(a, b, c));
    printf("\nBy Optimal solution ,the min is %d\n", MinDistance(a, b, c));
    return 0;
}

 5、这几天有点事,第5题还没仔细研究,要是解出来会第一时间更新博客!有求解方法的朋友欢迎评论!

题目部分摘取自july CSDN网站:http://blog.csdn.net/v_july_v/article/details/11921021

 

注:1.本文版权归作者和CSDN所有,未经作者允许不得转载,侵权必究!

2.本博客与博客园上的博客为同一博客主:http://www.cnblogs.com/bestDavid/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

阿里巴巴笔试题选解 的相关文章

  • fgetc,fgets,getline用法

    Linux Ubuntu 下用法 在Ubuntu下shell中 xff0c man fgets可以看到fgetc fgets等用法 xff0c man getline可以看到getline用法 span class hljs comment
  • 使用PyQt4制作一个音乐播放器(1)

    1 前言 最近用Python给老妈写了一个处理excel表格的小软件 xff0c 因为自己平时用Python一般都是用在数值计算领域 xff0c 所以一般使用命令行的方式交互即可 但是给老妈用发现用命令行交互方式使用并不是很方便 xff0c
  • ubuntu18.04/16.04 忘记开机密码,咋办?

    自己的 笔记本 装了双系统 xff0c 很久没有ubuntu系统了 xff0c 密码竟然给忘记了 于是乎 xff0c 在网上找答案 精髓 大概就是在句话 xff1a recovery nomodeset 并将之删除 xff0c 然后下移一行
  • C++ 实现阻塞队列

    文章出处 xff0c 来源自地址 xff1a C 43 43 实现阻塞队列 文章 详细代码 xff1a include lt queue gt include lt thread gt include lt mutex gt include
  • 浏览器请求nodejs搭建的web服务器上的html文件时引用不了jQuery.js文件解决办法

    构建web服务器代码 nodejs构建 span class token comment 引入核心模块http和fs span span class token keyword var span http span class token
  • AI 到底是怎么「想」的?

    本文作者 xff1a kurffzhou xff0c 腾讯 TEG 安全工程师 最近 xff0c Nature发表了一篇关于深度学习系统被欺骗的新闻文章 xff0c 该文指出了对抗样本存在的广泛性和深度学习的脆弱性 xff0c 以及几种可能
  • kafka3.1 docker-compose方式安装(二)

    ZooKeeper 是为 Kafka 提供协调服务的工具 xff0c 所以得启动一个ZooKeeper 容器 配置文件 docker compose yml span class token key atrule version span
  • 效能优化实践:C/C++单元测试万能插桩工具

    作者 xff1a mannywang xff0c 腾讯安全平台后台开发 研发效能是一个涉及面很广的话题 xff0c 它涵盖了软件交付的整个生命周期 xff0c 涉及产品 架构 开发 测试 运维 xff0c 每个环节都可能影响顺畅 高质量地持
  • Windows使用cmd刷入recovery.img

    Windows使用cmd刷入recovery img Windows键 43 R回车后进入cmd命令终端 进入fastboot 手机进入fastboot模式有2种方法 第一种进入方法是 xff0c 如果你的手机能用adb识别到 xff0c
  • Linux系统安装环境桌面

    最近工作加班还有在弄大数据 xff0c 有段时间没有记录了 xff0c 后续有空的话整理下大数据的东西分享 xff0c 今天记录下Linux安装环境桌面 之前弄了个阿里云服务器玩玩 xff0c CentOS 7的版本 xff0c CentO
  • 【Linux学习笔记】关于ubuntu开机菜单栏和任务栏不见了的有效解决方法

    一 问题描述 ubuntu开机只有桌面 xff0c 没有菜单栏和任务栏 xff0c 如下图 xff1a 二 问题解决 刚学习ubuntu xff0c 总有些像我这样不折腾就不舒服的人 xff0c 今天改了一下主题 xff0c 图标什么的 x
  • 【数据结构与算法】深入浅出递归和迭代的通用转换思想

    深入浅出递归和迭代的通用转换思想 一般来说 xff0c 能用迭代的地方就不要用递归 xff01 理论上讲 xff0c 所有的递归和迭代之间都能相互转换 xff01 刷题碰到 一天一道LeetCode 130 Surrounded Regio
  • 【unix网络编程第三版】阅读笔记(二):套接字编程简介

    unp第二章主要将了TCP和UDP的简介 xff0c 这些在 TCP IP详解 和 计算机网络 等书中有很多细致的讲解 xff0c 可以参考本人的这篇博客 计算机网络 第五版 阅读笔记之五 xff1a 运输层 xff0c 这篇博客就不再赘述
  • 带你深入理解STL之Deque容器

    在介绍STL的deque的容器之前 xff0c 我们先来总结一下vector和list的优缺点 vector在内存中是分配一段连续的内存空间进行存储 xff0c 其迭代器采用原生指针即可 xff0c 因此其支持随机访问和存储 xff0c 支
  • 带你深入理解STL之Set和Map

    在上一篇博客 带你深入理解STL之RBTree中 xff0c 讲到了STL中关于红黑树的实现 xff0c 理解起来比较复杂 xff0c 正所谓前人种树 xff0c 后人乘凉 xff0c RBTree把树都种好了 xff0c 接下来就该set
  • Redis源码剖析--字符串t_string

    前面一直在分析Redis的底层数据结构 xff0c Redis利用这些底层结构设计了它面向用户可见的五种数据结构 xff0c 字符串 哈希 xff0c 链表 xff0c 集合和有序集合 xff0c 然后用redisObject对这五种结构进
  • 制作启动盘安装Ubuntu 18.04.1

    1 使用UltraISO制作启动盘 首先 xff0c 下载Ubuntu镜像文件 链接 xff1a https pan baidu com s 1saIJuLzAR5ojc7 F3EQ Q 提取码 xff1a 1hc1 打开UItralISO
  • Redis源码剖析--快速列表quicklist

    在RedisObject这一篇博客中 xff0c 有介绍到list结构的底层编码类型有OBJ ENCODING QUICKLIST xff0c 当时就发现这个底层数据结构被我遗漏了 昨天花了点时间补了补这个知识 xff0c 看完发现这货就跟

随机推荐

  • Redis源码剖析--列表list

    上一篇博客Redis源码剖析 快速列表 带大家一起剖析了quicklist这个底层数据结构的实现原理 Redis对外开放的列表list结构就是采用quicklist作为底层实现 xff08 在新版本的Redis源码中 xff0c 不再采用z
  • lottie图片图层的json参数

    https juejin cn post 6992014666159357989
  • Android 各镜像文件img详解

    Android编译后生成文件 xff0c 在out target product xxx下 xff1a cache img cust img metadata img misc img xff08 本地无 xff09 recovery im
  • Android 10 来袭

    Android 10围绕三个重要主题构建 首先 xff0c Android 10正在塑造移动创新的领先优势 xff0c 具有先进的机器学习功能 xff0c 并支持新兴设备 xff0c 如可折叠和5G手机 接下来 xff0c Android
  • python代码规范 以及如何处理Pycharm的波浪号警告

    一 命名规范 1 模块名和包名采用小写字母并且以下划线分隔单词的形式 xff1b 如 regex syntax py compile winreg 2 类名或异常名采用每个单词首字母大写的方式 xff1b 如 xff1a BaseServe
  • java 两数相除 四舍五入 精确 保留2位小数点、任意位小数点

    java 四舍五入 精确 保留2位小数点 任意位小数点 int i 61 4 int j 61 14 float result 61 float i j java text DecimalFormat format 61 java text
  • 电脑关机或重启C盘数据被清空还原问题

    电脑关机后清空数据是因为电脑装有还原精灵 xff0c 可以下载冰点破坏工具 还原精灵破坏工具 硬盘保护卡破坏工具来取消数据的清空 电脑重启不还原 xff0c 方法如下 xff1a 方案一 一般情况下可以用带FDISK的启动盘启动电脑 xff
  • 敏捷教练的十种能力

    1 具备神奇的 读懂一个房间 的能力 只要走进一个房间 xff0c 就能判断出不在的过程中 xff0c 房间里发生了什么事情 xff0c 能立即读出空气中蕴含的情绪 xff0c 从而判断是否一切正常 xff1b 2 关心人本身胜过关心产品
  • Java数组之二分法查找数

    数组的二分法查找数据 使用前提 xff1a 查找的数组必须是有序的 span class token keyword public span span class token keyword class span span class to
  • MQ 队列管理器常见错误解析

    消息管理器无法连接到目标队列管理器 请确保以下事项 xff1a 在 消息管理器 队列管理器定义中所定义的端口与通道侦听器使用的端口相匹配 WebSphere MQ 队列管理器通道侦听器已启动 WebSphere MQ 队列管理器命令服务器已
  • 【简单理解】ubuntu中的sudo和su

    参考 xff1a https blog csdn net liberty12345678 article details 87686284 https cloud tencent com developer article 1721753
  • 那些女程序员们的故事

    点击上方蓝字 关注我们 xff0c 和小伙伴一起聊技术 xff01 程序媛是程序员大军中一道美丽的风景线 xff0c 今天的这篇文章就选取了一些女程序员们的故事 xff0c 希望当所有人了解了他们的经历后 xff0c 能让这个 重男轻女 的
  • 直播分享丨前沿技术讲习班:知识图谱前沿技术与应用(CIPS ATT27)

    本文转载自公众号 xff1a 智源社区助手 作为大数据时代重要的知识表示方式 xff0c 知识图谱是人工智能领域构建和应用知识的新阶段 xff0c 它能够更好地实现大规模数据的认知与推理 同时 xff0c 知识图谱和深度学习相互协作 xff
  • 图谱实战 | 京东基于时序知识图谱的问答系统

    转载公众号 DataFunSummit 分享嘉宾 xff1a 商超博士 京东硅谷研究院 研究员 编辑整理 xff1a 张存旺 北航杭州创新研究院 出品平台 xff1a DataFunTalk 导读 xff1a 本文将分享Temporal K
  • 肖仰华 | 基于知识图谱的问答系统

    本文转载自公众号知识工场 本文整理自复旦大学知识工场肖仰华教授在VLDB 2017 会议上的论文报告 xff0c 题目为 KBQA Learning Question Answering over QA Corpora and Knowle
  • 研讨会 | 知识图谱前沿技术课程暨学术研讨会(武汉大学站)

    知识图谱作为大数据时代重要的知识表示方式之一 xff0c 已经成为人工智能领域的一个重要支撑 4月 28日 xff0c 武汉大学信息集成与应用实验室 与 复旦大学知识工场实验室 联合举办 知识图谱前沿技术课程暨学术研讨会 xff0c 将结合
  • jdbc中Statement和PreparedStatement有什么区别?哪个性能更好?

    Statement和PreparedStatement的功能主要是对sql语句的执行 区别 xff08 1 xff09 Statement每执行一条sql语句就需要生成一条执行计划 xff0c 执行100条就需要100条执行计划Prepar
  • redis的特性

    redis的特性 承接上文redis入门篇 xff0c 本文具体介绍一下redis的特性 xff0c 以及与另外一个nosql数据库memcached的对比 一 redis的优点 根据上文 xff0c 我们知道redis的如下特性成为了他的
  • Ubuntu22.04安装windows字体

    找到C Windows目录 xff0c 将其中的Fonts文件夹拷贝至ubuntu中 将该文件夹放至ubuntu的 usr share fonts目录下面 xff0c 可用下列命令 span class token function sud
  • 阿里巴巴笔试题选解

    阿里巴巴笔试题选解 9月22日 xff0c 阿里巴巴北邮站 小题 xff1a 1 有三个结点 xff0c 可以构成多少种二叉树形结构 xff1f 2 一副牌52 张 去掉大小王 xff0c 从中抽取两张牌 xff0c 一红一黑的概率是多少