阿里笔试题

article/2025/9/30 2:06:02

小刘家里有n个鸟蛋,大小为a_i,并且大小互不相同,他有n个孵蛋器,第i个孵蛋器每天可以长大i。那么最早几天会有同样大小的蛋出现,规则:最大的鸟蛋放最慢的,最小的放最快的,其它依类次类推。

要求:1s,内存大小忘了。

输入:1<=n<=10^6

1<=a_i<=10^9

例子:

输入:3

8 4 2

输出:2。

这个其实很好算。(8-4)/(2-1)=4

(4-2)/(3-2)=2

(8-2)/(3-1)=3

所以是2。

#include<iostream>
#include<vector>
#include<algorithm>
#include<numeric>
#include <cmath>
using namespace std;
int main()
{int n,m;cin>>n;vector <int> a(n),s;for(int i=0;i<n;i++){cin>>a[i];}for(int i=n;i>0;i--){for(int j=1;j<i;j++){s.push_back( ceil((a[j-1]-a[i-1])/((double)i-j)) );}}cout<<*min_element(s.begin(),s.end());
}

 

这个是我一开始的代码,我记得测试的通过率是50%,但是内存太大了,而且有瑕疵。空间复杂度为O(n^2)。

int的范围已经包括了10^9。

改进的话,主要是改进空间。

#include<iostream>
#include<vector>
#include<algorithm>
#include<numeric>
#include <cmath>
using namespace std;
bool cmp(int a,int b)
{return a>b;
}int main()
{int n=4,m;const int MAX=10000;// cin>>n;int a[n]={21,16,9,1},s[n-1];sort(a,a+n,cmp);// for(int i=0;i<n;i++)// {//     cin>>a[i];// }for(int i=n-1;i>0;i--)//n-1---1{for(int j=0;j<i;j++)//0到i-1{if((a[j]-a[i]) % (i-j)){s[j]=MAX;}else{s[j]=(a[j]-a[i])/(i-j);}}s[i-1]=*min_element(s,s+i);}cout<< *min_element(s,s+n-1);return 0;
}

 

这样s数组是复用的,大大节省了空间。min_element返回最小值的指针,它其实用选择排序一轮就可以得到,复杂度为O(n)。

整体复杂度O(n^2),空间复杂度为O(n)。

从a[n-1]和a[0]-a[n-2]比较,存最小值,如果不能整除给个很大的值。

然后a[n-2]和a[0]到a[n-3]逐个操作,也存起来。

最后找最小值的最小值。

可以在1s内结束。

我其实还有一种其他的思路,就是先比较2个的,然后比较三个的,以此类推,复杂度也是O(n^2),空间复杂度也是O(n)。

 

#include<iostream>
#include<vector>
#include<algorithm>
#include<numeric>
#include <cmath>
using namespace std;
bool cmp(int a,int b)
{return a>b;
}
int main()
{int n=3,m;const int MAX=10000;// cin>>n;int a[n]={8,4,2},s[n];sort(a,a+n,cmp);s[n-1]=a[0]-a[1];for (int i = 2; i < n; ++i){for (int j = 0; j <i; ++j){if ((a[j]-a[i])%(i-j)){s[j]=MAX;}else{s[j]=(a[j]-a[i])/(i-j);}}s[n-1]=min(s[n-1],*min_element(s,s+i));}// for(int i=0;i<n;i++)// {//     cin>>a[i];// }cout<< s[n-1];return 0;
}

这个也不错,这个等于用了DP的思想,先存储前三个的最小值,然后第四个和前三个分别算,这四个数里取最小的值。以此类推。

有n家店,相邻有n-1个过道,每个过道有一个权值,每经过一次权重减去1,价值+1,为0的路不能走,求可以获得的最大价值。

暂时不太会。


http://chatgpt.dhexx.cn/article/dxgJC08S.shtml

相关文章

大数据阿里面试笔试题总结,我的结果 当然是凉凉

我 秀儿 在学习大数据一年后去了阿里面试,这是我笔试的时候题目,虽然我凉了,但是希望大家加油 总结给大家看看 参考下面的M R系统的场景:HDFS 块大小为64MB;输入类型为FileInputFormat;有三个文件大小分别是: 0.在Hadoop中定义的主要公用InputFormat中,默认是哪一个…

阿里20道经典测试题,一个月吐血整理,你会几题?背下来,帮你成功就业(有答案版)

一、怎样把自动化测试在公司中实施并推广起来&#xff1f; 1、项目组调研选择自动化工具并开会演示demo案例&#xff0c;我们主要是演示selenium和robotframework两种。 2、搭建自动化测试框架&#xff0c;在项目中逐步开展自动化。 3、把该项目的自动化流程、框架固化成文档…

数据结构(使用头插法实现单链表)

一.定义 1.线性表的链式存储就是单链表&#xff0c;单链表通过一组任意的存储单元来存储线性表的数据元素&#xff08;逻辑相邻&#xff0c;存储离散&#xff09;&#xff0c;单链表对于每一个链表结点&#xff0c;不但存储自身数据&#xff0c;还开辟了存储一个指向后继结点的…

【Java】JDK 7 HashMap 头插法在并发情况下的成环问题

CONTENT 问题描述成因详解总结Reference 问题描述 JDK 7 的 HashMap 解决冲突用的是拉链法&#xff0c;在拉链的时候用的是头插&#xff0c;每次在链表的头部插入新元素。resize() 的时候用的依然是头插&#xff0c;头插的话&#xff0c;如果某个下标中的链表在新的 table 中依…

java 如何实现单链表中的头插法

文章目录 头插法1 思路2 插入过程2.1 定义node节点2.2 将node插入到原来head前面的位置2.3 将node节点与下一个结点链接起来2.4 更改head的指向 3 注意点4 为空的情况5 代码实现 头插法 1 思路 先定义一个新的节点&#xff0c;命名为node。将node插入到原来单链表头节点的前面…

头插法建立链表详解

头插法就是建立一个头节点&#xff0c;进行初始化定义&#xff0c;next存储下一个节点位置的地址&#xff0c;初始化定义指针域为空&#xff0c;表示该头部节点后面指向任何位置的地址&#xff0c;开始时只有一个头部节点。 head -> next NULL; 图形化表示为 申请一个新节…

头插法创建单链表

1.对单链表的解释 链表与顺序表不同&#xff0c;它是一种动态管理的存储结构&#xff0c;链表中的每个结点占用的存储空间不是预先分配的&#xff0c;而是运行时系统根据需求生成的&#xff0c;因此建立单列表要从空表开始&#xff0c;每读入一个数据元素则申请一个结点&#…

头插法逆置单向链表c语言,单链表的逆置(头插法和就地逆置)

今天课间的时候偶然看到了一个面试题&#xff1a;单链表的逆置&#xff0c;看了题解感觉乖乖的&#xff0c;貌似和以前看的版本不搭&#xff0c;于是重新进行了一番探究 单链表的逆置分为两种方法&#xff1a;头插法和就地逆置法&#xff0c;这两种方法虽然都能够达到逆置的效果…

头插法和尾插法

链表的头插法和尾插法 表结构的声明 typedef int ElemType; typedef struct node //定义链表的结点的结构 {ElemType data;//定义链表的数据域struct node *next;//定义链表中的指针域 }slink;头插法 1&#xff0c;从一个空表开始&#xff0c;重复读入数据&#xff0c;生成新…

单链表之头插法

1、前言&#xff1a; 什么是头插法&#xff1f;说白了头插法就是新增节的点总是插在头节点后面&#xff0c;然后大家可能会有疑惑&#xff0c;什么是新增节点&#xff0c;什么是头节点呢&#xff0c;下面请听俺娓娓道来。。。 2、预前准备&#xff1a; 头节点&#xff1a;一…

单链表的头插法和尾插法的示例

单链表是数据结构中最基本的数据结构&#xff0c;单链表有头插法和尾插法&#xff0c;今天有空把这两者做成一个实验示例以作比较。 提示&#xff1a;编译代码是否通过可能与编译器的版本有关&#xff0c;本程序是在 Android 操作系统下的 Compiler C语言编译器下编译通过。 一…

头插法实现单链表逆置

在头结点的后面依次插入后面的结点&#xff0c;q从第二个结点向后移动遍历&#xff0c;p永远在第一个结点完成头插法逆置单链表。 void reverseL(Linklist &L){//头插法逆转单链表if(L!NULL){LNode* pL->next;//p等于第一个结点LNode* qp->next;//q等于第二个结点p-…

HashMap/ConcurrentHashMap/头插法/尾插法

1.1 HashMap JDK1.7 JDK1.8 存储 数组链表 数组链表红黑树 位置算法 h & (length-1) h & (length-1) 链表超过8 链表 红黑对(链表超过8且数组长度超64) 节点结构 Entry<K,V> implements Map.Entry<K,V> Node<K,V> implements Map.Entry…

C语言 链表 头插法

代码&#xff08;VS2017中运行&#xff09; #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct student {int num;float score;struct student *pnext;//*pnext存的是下一个节点的首地址 }stu,*pst…

头插法建立单链表

头插法建立单链表图示过程&#xff08;其中an表示时间上第n个建立的节点&#xff0c;L为头指针&#xff0c;箭头表指向&#xff0c;sn代表an的地址&#xff09; 结构体代码与主函数如下&#xff1a; struct Link //创建一个结构体类型 {int data; //数据域struct Link* p; /…

Java实现头插法

实现原理&#xff1a; 这是第一个头结点&#xff0c;现在要插入一个节点&#xff0c;也就是让新节点指向该头结点&#xff0c;任何让head指向新节点&#xff0c;新节点变为头结点。 代码实现&#xff1a; 实体类&#xff1a; public class entity {private String data;privat…

单链表的头插法

链表与顺序表不同链表是用一组任意的储存单元来存放线性表的结点&#xff0c;这组结点可以是连续的&#xff0c;也可以是非连续的&#xff0c;甚至可以是零散分布在内存的任何位置&#xff0c;为了能正确的去表达结点的逻辑关系&#xff0c;必须在储存元素值的同时&#xff0c;…

HashMap在JDK1.7版本头插法实现解析

HashMap在JDK1.7版本头插法实现解析 先解释下何为头插法。大家都知道HashMap在JDK1.7版本的数据结构为数组链表这样的形式。而头插法说的就是在往HashMap里面put元素时&#xff0c;此时新增在链表上元素的位置为链表头部&#xff0c;也就是数组桶位上的那个位置&#xff0c;故…

头插法链表反转c语言,用头插法反转链表

题目&#xff1a;输入一个链表的头结点&#xff0c;反转该链表&#xff0c;并返回反转后链表的头结点。 链表结点定义如下&#xff1a; typedef char item_t; typedef struct node { item_t item; struct node * next; } node_t; 分析&#xff1a; 使用头插法可以快速实现反转。…

链表头插法

头插法 从一个空表头指针开始&#xff0c;重复读入数据&#xff0c;生成新节点&#xff0c; 将读入数据存放到新节点的数据域中&#xff0c;永远是将新节点插入到当前链表的头节点的后面&#xff0c;第一个创建的节点是放在最后的&#xff0c;直到读入结束标志才停止创建。 #in…