2021/4/2 阿里实习笔试
放假在家没事就弄了某招聘app的个人信息,最近收到阿里的内推,啥也没准备比较冒失就上了。。。。结果可想而知比较烂。。。
第一次写博客就随手写写吧,记录一下准备考研之余的刷题历程。
笔试共两题,写了半个题,一开始思路错误就裂开了。。。
一个小时后复盘想到了一个解法,不知道对不对,请教做出来的大佬拜托了。
题1
给定一个非递减int数组,你可以对任意数组中任意数字加1,也可以不对该数字操作,每个数字只能操作一次。统计最后数组中非重复数的个数最多是多少。
输入:
2
6
1 2 4 4 4 5
2
4 4
输出:
5
2
说明:第一行输入数组个数n,随后输入第i个数组的大小,下一行输入第i个数组。输出对应数组的结果。
1 2 4 4 4 5可以变成1 2 4 5 5 6,对应五个非重复数,为最大情况。4 4可任意加1变为4 5或5 4,对应两个非重复数,为最大情况。
做题思路:
只要第 i 个数之前有跟它相等的数,第 i 个数进行加1操作。因为非递减数组,前边有这个数了就不需要再有这个数了,加即可。
非重复数个数统计用“鸠占鹊巢”的概念,建一个操作后数组中最大数字大小的布尔vector数组,默认初始化为false。记count为数组中重复数字的个数,最后总个数减去n即为非重复数字个数。遍历操作后数组,数组数字减1作为vector下标。若是第一次访问vector对应的值,应该为false,此时设为true。故若为true,必已经访问过,count++。
代码实现如下:
#include <iostream>
#include <vector>
using namespace std;
int func(int a[],int n){
for(int i=1;i<n;i++){
for(int j=0;j<i;j++){
if(a[j]==a[i]){
a[i]++;
break;
}
}
}
for(int i=0;i<n;i++){
cout<<a[i]<<endl;
}
cout<<endl;
int count=0;
vector<bool> flag(a[n-1]+1,0);
for(int i=0;i<n;i++){
if(flag[a[i]]!=0){
count++;
}
else{
flag[a[i]]=1;
}
}
return n-count;
}
int main() {
int n;
cin>>n;
int len=n;
int ans[n];
int i=0;
while(n>0){
int o;
cin>>o;
int a[o];
for(int i=0;i<o;i++){
cin>>a[i];
}
cout<<endl;
int temp=func(a,o);
ans[i]=temp;
i++;
n--;
}
for(int i=0;i<len;i++){
cout<<ans[i]<<endl;
}
}
感觉阿里的笔试跟自个儿leetcode上的差异极大。浅薄的认识在于阿里的算法题跟市面上的不太一样,需要举一反三的能力,终究是自己能力不足。这次笔试一开始就是冲着被羞辱的目的去的,意识到了自己薄弱的算法能力,不说了刷题学算法去了家人们。。
第二题都忘了是什么了,欢迎补充。
2468

被折叠的 条评论
为什么被折叠?



