腾讯笔试题——逆序对

article/2025/11/5 14:02:24

这题花了我非常多时间,ac率从10% --> 50% --> 60% --> 70% --> 80% --> 100% ,被这题疯狂支配几个小时!
最关键没有详细的题解可以参考,大数据报错时也无法调试,只有反复一遍又一遍分析,下面把我踩到的坑记录下,或许可以帮到遇到同样问题的人。

题目描述

逆序对
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
简而言之,就是给你一组数,然后多次翻转,每次翻转后求解逆序对数量。

分析

要求解逆序对,首先可以想到用归并排序求解逆序对,因此首先需要掌握这一题。
归并排序求解逆序对
我的代码
另外掌握了利用归并排序求解逆序对后,可以想到暴力解,即每次翻转,然后利用归并排序求解逆序对,不过复杂度太高,只能通过50%的数据。显然每次都要归并排序成本太高,那么可不可只使用一次归并排序哪?

可以发现,逆序对翻转后,变成顺序对,如1 2,翻转变成2 1。因此我们需要记录不同长度的逆序对和顺序对的数量,当翻转时,仅需交换小于等于该翻转长度的逆序对和顺序对(因为大于翻转长度的逆序对不会收到影响),将所有的逆序对加起来即可得到结果。
举个例子,如 2 1 4 3,长度为2 ^ 1的逆序对数量为2(2 1一对,4 3一对),长度为2 ^ 2的逆序对数量为0(2 1 4 3中2 1 和4 3不构成逆序对,不要重复计算)。之后便可以只交换逆序对和顺序对数量,求逆序对的和即可。
顺序对怎么计算,可以考虑用总数-逆序对-相等的对(相等的对翻转了也不是逆序对,只过了百分之60的可以看看是否考虑到了两个数相等的情况),不过我这么做数据只过了70%,80%,最后也没发现错在哪,所以换了种思路,即将整个数组倒过来,求解逆序对,就是原数组的顺序对

代码

#include <vector>
#include <iostream>
#include <math.h>
using namespace std;
void merge(vector<long long int>&nums, long long int lbegin, long long int lend,long long int rbegin,long long int rend,long long int index,vector<long long int>&cnt) {long long int p1 = lbegin, p2 = rbegin;vector<long long int> tmp(rend - lbegin + 1);long long int i = 0;long long int pairsCnt = 0;while (p1 <= lend && p2 <= rend) {if (nums[p1] <= nums[p2]) {tmp[i++] = nums[p1++];}else if(nums[p1]>nums[p2]){pairsCnt += (lend - p1 + 1);tmp[i++] = nums[p2++];}}while (p1 <= lend) {tmp[i++] = nums[p1++];}while (p2 <= rend) {tmp[i++] = nums[p2++];}for (int i = 0; i < tmp.size(); i++) {nums[lbegin++] = tmp[i];}cnt[index] += pairsCnt;
}
void mergeSort(vector<long long int>& nums, long long int begin, long long int end, long long int index,vector<long long int>& cnt) {if (begin == end)return;long long int mid = (end - begin) / 2 + begin;mergeSort(nums, begin, mid,index-1,cnt);mergeSort(nums, mid + 1, end,index-1,cnt);merge(nums, begin, mid, mid + 1, end,index,cnt);
}
int main() {ios::sync_with_stdio(false);long long int n;cin >> n;long long int cnt = pow(2, n);vector<long long int> nums;while (cnt--) {long long int tmp;cin >> tmp;nums.push_back(tmp);}vector<long long int> order(n+1,0);//保存不同长度的顺序对个数vector<long long int> reOrder(n+1,0);//保存不同长度的逆序对个数vector<long long int> reverse_nums(nums.rbegin(), nums.rend());mergeSort(nums, 0, nums.size() - 1,n,reOrder);mergeSort(reverse_nums, 0, reverse_nums.size() - 1, n,order);long long int m;cin >> m;while (m--) {long long int q;cin >> q;long long int cnt = 0;for (long long int i = 1; i <= q; i++) {swap(order[i], reOrder[i]);//每次反转后,需要交换q范围内顺序对和逆序对的数量}for (long long int i = 1; i <= n; i++) {cnt += reOrder[i];}cout << cnt << endl;}system("pause");return 0;
}

总结

  1. 暴力解每次都进行归并排序复杂度太高只能过50%;
  2. 用总数减逆序对需要考虑相等的情况,如果有大佬用这种方法过了希望可以解释下相等的情况怎么求解相等对的数量,我尝试了几次都有问题;
  3. 可以求解翻转的数组的逆序对来得到原数组的顺序对。

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

相关文章

2020秋招腾讯后台笔试题(一)

点击上方蓝字设为星标 下面开始今天的学习&#xff5e; 这是2020届腾讯秋招的笔试题&#xff0c;其实就是19年九月份的题目&#xff0c;总共五道题&#xff0c;这篇文章写说两道题&#xff0c;都是有关于栈的应用的 01 压缩算法 小Q想要给他的朋友发送一个神秘字符串&#xff0…

腾讯笔试-1

1、什么是运维&#xff1f;什么是游戏运维&#xff1f;1&#xff09;运维是指大型组织已经建立好的网络软硬件的维护&#xff0c;就是要保证业务的上线与运作的正常&#xff0c;在他运转的过程中&#xff0c;对他进行维护&#xff0c;他集合了网络、系统、数据库、开发、安全、…

腾讯 C++ 笔试/面试题及答案

星标/置顶 公众号&#x1f447;&#xff0c;硬核文章第一时间送达&#xff01; 链接 | https://zhuanlan.zhihu.com/p/274473971 题很多&#xff0c;先上题后上答案&#xff0c;便于大家思考 问题点&#xff1a; 1、C和C的特点与区别&#xff1f; 2、C的多态 3、虚函数实现 4、…

腾讯2020校园招聘笔试

输入1&#xff1a; 2 2 1 1 1 1 输出1&#xff1a; 0 输入2&#xff1a; 2 2 1 2 2 1 输出2&#xff1a; 2 import java.util.Scanner; public class Main { public static void main(String[] args) {// TODO Auto-generated method stubScanner scnew Scanner(Syste…

腾讯笔试题20210321

一、链表树 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言 2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言 524288K 64bit IO Format: %lld 题目描述 在牛牛所在的世界&#xff0c;链表是一种二叉树。 这是牛牛第一次见到链表树&#xff0c;他感到十分好奇&a…

腾讯2021批笔试题解

总结&#xff1a;一套算是正常的笔试…算是让大家有点思考了…都没那么一眼秒&#xff08;除了强烈谴责某T5最短路板子。我还差点没看到这题hhh&#xff08;&#xff08; &#xff08;另一套题的T5&#xff09; T5 题目大意&#xff1a;给出n个红球&#xff0c;n个黑球&#x…

腾讯笔试题精选一

1.32位机上根据下面的代码&#xff0c;问哪些说法是正确的&#xff1f;&#xff08;&#xff09; signed char a 0xe0 unsigned int b a; unsigned char c a; A. a>0 && c>0 为真 B.a c 为真 C.b的十六进制表示是&#xff1a;0xfffffe0 D.上面都不对 sig…

腾讯笔试题_20220424

前言 笔试一共五道编程题&#xff0c;满分是100分&#xff0c;时间是两个小时&#xff0c;可以跳题&#xff0c;使用的平台是牛客网&#xff0c;允许跳出界面使用本地IDE。 题目一&#xff1a;构建数字 给定n个长度均为m的数字字符串&#xff0c;从上往下构建成m个新的数&am…

笔试面试(1)腾讯2014校园招聘软件开发类笔试试题

把基本经典的书籍认真看看,那些笔试面试的都不是什么问题。但是,专门的突击和训练还是很有必要的。 好的offer是可以通过充分的准备刷到的。 我们就从各大公司的套题开始刷起吧,中间再穿插一些专题。 今天先看看腾讯的2014年校招的软开笔试题。 考试时长:120分钟 一 不定项…

腾讯近三年软件测试工程师面试笔试题目精选(包含答案)

目录 1、什么是兼容性测试?兼容性测试侧重哪些方面? 2、我现在有个程序&#xff0c;发现在 Windows 上运行得很慢&#xff0c;怎么判别是程序存在问题 还是软硬件系统存在问题? 3、测试的策略有哪些? 4、正交表测试用例设计方法的特点是什么? 5、描述使用 bugzilla 缺…

Dev ChartControl 显示设置百分比

**Dev ChartControl 显示设置百分比**//Y轴设置成百分数显示((XYDiagram)Chart.Diagram).AxisY.Label.TextPattern "{V:0%}";//显示的值为百分数 for (int j 0; j < Chart.Series.Count; j){Series march Chart.Series[j];march.CrosshairLabel…

DevExpress——ChartControl知多少(C#)

目前在做的这个项目后端是使用.NET框架在做,前端是借助DevExpress框架做开发,由于是基于Winform的页面实现,于是DevExpress提供了全套的Winform的解决方案,弥补了Winform本身的工具箱不全且不再维护的弊端。DevExpress提供的表图控件叫做ChartControl,在其上面可以完成图表…

Dev中的ChartControl的Y轴显示单位

1.点击Y轴,打开属性 2.找到Title属性,设置其中的 Alignment(单位文本显示的位置) Font(文本字体大小) Text(文本内容) TextColor(文本颜色) Visibility(可见性) 设置完成后即可在图中看到设置效果

DEV控件之ChartControl用法 z

一、总体概述 这个控件包含3层&#xff0c;最外面的chartControl层、中间的XYDiagram层、最里面的Series层。功能非常强大&#xff0c;但同时使用起来也相对复杂&#xff0c;需要各个层之间相互协调设置才能达到自己想要的效果。 二、chartControl层 像DEV的其它控件一样&#…

ChartControl控件绘制柱状图

1、新建一个DevExpress窗体&#xff08;不要用WinForm窗体&#xff09; 2、拖入一个chartcontrol控件 3、鼠标右键&#xff0c;点击run designer 添加两个series 4、代码设置 数据库表结构&#xff0c;我的想法是统计办事员和售货员的人数 数据库查询语句 select job,co…

C# WPF图表控件之ChartControl用法指南①

“ 引言部分&#xff0c;总领全篇文章的中心内容。” WPF的DevExpress ChartControl是一种功能强大的可视化工具&#xff0c;可帮助您将数据显示为二维或伪三维条形图、区域、线和许多其他形式。 01 — 将数据绑定到Chart Series Step 1. 创建新项目并添加图表 创建一个新的WPF…

chartControl控件常用属性总结

chartControl可以绘制常见的柱状图&#xff0c;折线图&#xff0c;饼图&#xff0c;在windows form 窗体应用程序中可以很方便的使用。下面总结一下如何使用chartControl控件绘图&#xff0c;以及一些常用的属性。 1.添加series DevExpress.XtraCharts.Series _serTimechartCo…

在C#中使用DevExpress中的ChartControl实现极坐标图

在C#中使用DevExpress中的ChartControl实现极坐标图 背景实现思路参考代码 背景 在工控软件的开发中很多业务场景就是使用图表控件展示设备和工艺参数。如下图案例&#xff1a; 实现思路 通常简单的做法是使用图表控件实现&#xff0c;常用的图表控件有开源的ZedGraph&…

DevExpress ChartControl ToolTipPointPattern和ToolTipSeriesPattern

原本只是想改一下鼠标放到曲线上的tip显示的小数点位数 然后就发现他这个属性还挺多&#xff0c;多到有点看不懂 然后就写了小demo测试 demo代码 // Create a series and add points to it. Series series1 new Series("Series 1", ViewType.Line);series1.Points…