导读

昨天参加了华为的上机笔试,整体感觉有点难,第一题直接整道hard,着实遭不住,下面就我的笔试情况,和大家谈论一下第一题。

题目

第一题,送祝福,题目大体意思就是一排人,每个人都有一张带有数字的卡片,大小不重复,如果你的比后面的人大,就要给后面的人送去祝福,最后返回祝福的数组blessing。

解题思路

大家一看,可以很快想出暴力解法,直接两层for循环,每次判断后面比你小的人有多少,记录count即可。但是毫无意外必定超时(我试了),接下来,我想可不可以利用dp,从后往前遍历,记录每个位置后面比你小的个数,但是元素是无须的无法找到比你小的第一个元素的下表。如果利用利用hashMap存储,还是要线性遍历,时间复杂度,完全不可以。

大家可以细心的发现,这就是个统计逆序对(前面大于后面)的数量,但是需要求对应位置的逆序对。逆序对,可以用归并排序,每次在合的时候做文章,此时判断左边与右边的大小,如果左边大于右边,此时统计逆序对,如果小于,正常归并即可。下面给出代码

    public List<Integer> countSmaller(int[] nums) {List<Integer> result = new ArrayList<>();int len = nums.length;if (len == 0) {return result;}int[] temp = new int[len];int[] res = new int[len];// 索引数组,作用:归并回去的时候,方便知道是哪个下标的元素int[] indexes = new int[len];for (int i = 0; i < len; i++) {indexes[i] = i;}mergeAndCountSmaller(nums, 0, len - 1, indexes, temp, res);// 把 int[] 转换成为 List<Integer>,没有业务逻辑for (int i = 0; i < len; i++) {result.add(res[i]);}return result;}/*** 针对数组 nums 指定的区间 [left, right] 进行归并排序,在排序的过程中完成统计任务*/private void mergeAndCountSmaller(int[] nums, int left, int right, int[] indexes, int[] temp, int[] res) {if (left == right) {return;}int mid = left + (right - left) / 2;mergeAndCountSmaller(nums, left, mid, indexes, temp, res);mergeAndCountSmaller(nums, mid + 1, right, indexes, temp, res);// 归并排序的优化,如果索引数组有序,则不存在逆序关系,没有必要合并if (nums[indexes[mid]] <= nums[indexes[mid + 1]]) {return;}mergeOfTwoSortedArrAndCountSmaller(nums, left, mid, right, indexes, temp, res);}/*** [left, mid] 是排好序的,[mid + 1, right] 是排好序的*/private void mergeOfTwoSortedArrAndCountSmaller(int[] nums, int left, int mid, int right, int[] indexes, int[] temp, int[] res) {for (int i = left; i <= right; i++) {temp[i] = indexes[i];}int i = left;int j = mid + 1;for (int k = left; k <= right; k++) {if (i > mid) {indexes[k] = temp[j];j++;} else if (j > right) {indexes[k] = temp[i];i++;res[indexes[k]] += (right - mid);} else if (nums[temp[i]] <= nums[temp[j]]) {// 注意:这里是 <= ,保证稳定性indexes[k] = temp[i];i++;res[indexes[k]] += (j - mid - 1);} else {indexes[k] = temp[j];j++;}}}

树状数组

下面还提供一种思路,就是树状数组(看了大佬的复盘),这里我只是简单的说下(因为不会用)。

  • 预备知识
    「树状数组」是一种可以动态维护序列前缀和的数据结构,它的功能是:

  • 单点更新 update(i, v): 把序列 i 位置的数加上一个值 v,在该题中 v = 1

  • 区间查询 query(i): 查询序列[1⋯i] 区间的,即 i 位置的前缀和

修改和查询的时间代价都是 O(log n),其中 n 为需要维护前缀和的序列的长度。

5.11华为笔试复盘相关推荐

  1. 华为笔试复盘 bfs-2 外卖员

    #include <iostream> #include <queue> using

  2. 2021/7/22 华为笔试复盘 1.自动驾驶出租车订单分配

    这个写出来的人脑子太强了 代码: #include <iostream> #include <algorithm> using namespace std; int n, k; ...

  3. Seeker的奇妙求职历险(华为笔试)

    矩阵报数 题目: 给出一个旋转矩阵,M行N列,左上角为(0,0),右下角为(M-1,N-1),从左上角开始计数,顺时针从外圈开始,外圈遍历完之后再遍历内圈,直到遍历完所有的点. 返回所有个位数为7且十 ...

  4. 华为 社招 C语言笔试,华为笔试C语言笔试题之3

    <华为笔试C语言笔试题之3>由会员分享,可在线阅读,更多相关<华为笔试C语言笔试题之3(10页珍藏版)>请在人人文库网上搜索. 1.C 语言笔试题之34. static 有什么 ...

  5. 2020.9.9华为笔试记忆:KMP+记忆化搜索+字典树

    2020.9.9华为笔试 当然,出现在我博客中的笔试都不是我自己的笔试(人家也不给我发笔试链接,小声bibi,诶,好像我也没投,hhhahahha 记者:为什么要做笔试? 我:生活无聊了喏,肯定要做啊 ...

  6. 阅文java服务端开发_阅文笔试复盘

    本文记录2020-05-19的阅文Java方向笔试复盘,有些题目不是很记得了,把自己记得的写一下吧. 单选题 多播的IP地址是哪一类? 说实话这个题一开始我也懵逼,虽然自己有点记忆但是不是很敢选,后来 ...

  7. 2019华为笔试 找终点

    [算法][华为]2019华为笔试 找终点:给定一个正整数数组,最大为100个成员,从第一个成员开始,走到数组最后一个成员最少的步骤数, https://blog.csdn.net/qinglingLS ...

  8. 华为笔试时发现golang ACM模式输入的一个坑

    华为笔试时发现golang ACM模式输入的一个坑 golang ACM模式常用输入方法(scan,bufio):https://zhuanlan.zhihu.com/p/551393704 问题 第 ...

  9. 【2019华为笔试】召唤师的技能——圆排列,翻转和项链排列

    题目描述: dota游戏里面,召唤师可以控制冰雷火三种元素,并通过元素组合产生新的技能.现在我们修改了张新的地图, 地图中他能够控制n种元素, 并且将m个元素围成一个圈组成一 个新技能(这m个元素通过 ...

最新文章

  1. CCS5.2 Graph的使用方法及步骤 FFT
  2. hdu 2159 FATE 二维背包
  3. ITK:将两个图像相乘
  4. 国内MySQL技术现状_1024不搬砖,谈谈自己2020剩余两月的学习计划
  5. python中对象的概念是什么_简述Python中的面向对象编程的概念
  6. 数据结构及算法 -- 目录
  7. MonoRail学习-介绍篇(一)
  8. linux-centos7 常用的基本命令--目录管理、基本属性
  9. 以流动债务为例论指标的合理使用
  10. docker配置深度学习环境
  11. C语言之指针的再次理解
  12. android push php,Android_android push推送相关基本问答总结,通知和消息有什么区别?通 - phpStudy...
  13. php实现小偷程序,PHP小偷程序的设计与实现示例
  14. 获取docker容器里面的root权限
  15. Actor模型和CSP模型的区别
  16. 人体脂肪的形成及如何消耗
  17. 永恒之蓝漏洞复现-CVE-2017-0144
  18. 最新Nikon镜头序列号查询,镜头产量估算2010.1.26更新
  19. 许三多:浮躁社会的反义词
  20. 06-App页面元素查看神器

热门文章

  1. c语言循环结构常用语句,浅析C语言三种循环结构语句
  2. 华测测绘仪X5安装问题笔记
  3. 艾美捷PD-1体内抗体说明书及相关研究
  4. ubuntu16下快速安装k8s教程与应用示例(django)
  5. conda配置国内源 anaconda
  6. ARM9的系统时钟和串口(非流控 + 非FIFO + 查询方式)
  7. 计算机程序设计艺术 介绍
  8. Java小白 电商项目总结
  9. 运算放大器产生自激的原因以及解决办法
  10. Java接口方法的三种类型