书架排书 逆序对

2023-12-31 16:59
文章标签 逆序 书架 排书

本文主要是介绍书架排书 逆序对,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

PayPal的一道笔试题,一个数组每一行代表书架上书的编号,每一行数组都有一个逆序对,想从逆序对小的开始排每一行的书,输入行数N,列数k, 以及N*k的数组;输出一个数组

比如输入

输出

 

 计算数组逆序对的函数是剑指offer上的,写出来不难,关键是怎么按照逆序对的大小把对应数组的顺序变换过来

数组直接输出有一个简单方法 Arrays.deepToString(num);

import java.util.*;
class Main{public static void main(String[] args){Scanner sc = new Scanner(System.in);while(sc.hasNext()){int N = sc.nextInt();int k = sc.nextInt();int[][] nums = new int[N][k];int[][] copy = new int[N][k];for(int i = 0; i < N; i++){for(int j = 0; j < k; j++){nums[i][j] = sc.nextInt();copy[i][j] = nums[i][j];}}Map<Integer,Integer> map = new HashMap<>();for(int i = 0; i < copy.length; i++){map.put(i,reversePairs(copy[i]));}List<Map.Entry<Integer,Integer>> list = new ArrayList<>(map.entrySet());Collections.sort(list,(a,b)->(a.getValue()-b.getValue()));Iterator<Map.Entry<Integer,Integer>> it = list.iterator();int[][] result = new int[N][k];int i = 0;while(it.hasNext()){Map.Entry<Integer,Integer> en = it.next();for(int j = 0; j < k; j++)result[i][j] = nums[en.getKey()][j];i++;}System.out.println(Arrays.deepToString(result));}}public static int reversePairs(int[] nums) {if(nums == null || nums.length == 0)return 0;return merge(nums,0,nums.length-1);}public static int merge(int[] nums, int l, int r){if(l >= r)return 0;int mid = l + (r - l)/2;int res = merge(nums,l,mid)+merge(nums,mid+1,r);int i = l;int j = mid + 1;int[] temp = new int[r-l+1];int k = 0;while(i <= mid && j <= r){if(nums[i] <= nums[j])temp[k++] = nums[i++];else{temp[k++] = nums[j++];res += mid-i+1;}}while(i <= mid) temp[k++] = nums[i++];while(j <= r)temp[k++] = nums[j++];i = l;for(int t: temp) nums[i++] = t;return res;}
}

 

这篇关于书架排书 逆序对的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/556637

相关文章

逆序和顺序创建单链表

单链表是一种顺序的存储方式,数据结构学的不好,考研又是必考内容,只好从头开始学习,相信不断地积累会有更好的爆发! 首先单链表的创建,单链表是建立在结构体的基础上,要创建单链表首先要建立起一个储存数据的结构体: struct node{int elem;node *next;};elem是数据域,用来存放你要输入的数据,next是指向下个存放数据节点的指针同为node 类型; 下面是

【Hdu】Minimum Inversion Number(逆序,线段树)

利用线段树在nlogn的时间复杂度内求一段数的逆序。 由于给的序列是由0 ~ n -1组成的,求出初始的逆序之后可以递推出移动之后的逆序数。 #include<cstdio>#include<iostream>#include<cstring>#include<algorithm>using namespace std;typedef long long LL;const in

数据结构——单链表查询、逆序、排序

1、思维导图 2、查、改、删算法 //快慢排序法找中间值int mid_link(Link_t *plink){Link_Node_t *pfast = plink->phead;Link_Node_t *pslow = pfast;int m = 0;while(pfast != NULL){pfast = pfast->pnext;++m;if(m % 2 == 0){pslow

java中一维数组、二维数组、查找某元素、数组查表法、逆序

一维数组 //定义:数据类型[] 数组名;int[] arr;//静态初始化int[] arr= {11,22,33};//动态初始化int[] arr= new int[3];//默认初始值会为0System.out.println(arr);//一个地址值System.out.println(arr[0]);//0 System.out.println(arr[1]);//0

【归并分而治之】逆序对的应对之策

目录 1.前言2.题目简介3.求解思路为什么要这样做?快在哪?为什么这种方法会想到结合归并排序?如何在一左一右中统计剩下的逆序对个数?固定右边的数,用降序会怎么样???思路的本质是巧妙地结合了归并的思想 4.示例代码 1.前言 今天了解到一种比较有意思的题目解法,是专门针对逆序对的。下面来进行简单分享。 2.题目简介 题目链接:LINK 3.求解思路 我们一种解法是

【Python 千题 —— 算法篇】逆序字符串

Python 千题持续更新中 …… 脑图地址 👉:⭐https://twilight-fanyi.gitee.io/mind-map/Python千题.html⭐ 题目背景 字符串操作在编程中非常常见,无论是数据处理、文本分析还是算法设计,字符串的处理都是基础且关键的一部分。尤其是在数据处理和编程竞赛中,字符串逆序是一个经典问题,它可以用于许多实际场景&

单链表创建-遍历-排序-插入-删除-逆序操作

#include <iostream>using namespace std;typedef struct NodeType{int data;NodeType* pNext;}NodeType;//链表的1创建 2 遍历 3排序 4 插入 5 删除NodeType* create_list();void traverse_list(NodeType* pHead);void sor

将一个字符串逆序排列

 将一个字符串逆序排列:原地转换 #include <stdio.h> int count(char * s) {      int n = 0;      while(*s++ != '\0')      n++;      printf("n = %d\n",n);      return n; } void conver(char * s,int n) {      int

#1141 : 二分·归并排序之逆序对(归并排序)

#1141 : 二分·归并排序之逆序对 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在上一回、上上回以及上上上回里我们知道Nettle在玩《艦これ》。经过了一番苦战之后,Nettle又获得了的很多很多的船。 这一天Nettle在检查自己的舰队列表: [list.png] 我们可以看到,船默认排序是以等级为参数。但实际上一个

基于HTML5 Canvas的CSG构造实体几何书架

CSG 构造实体几何这个概念在工业水利水电施工上、游戏上已经有很多人使用了,最简单的实体表示叫作体元,通常是形状简单的物体,如立方体、圆柱体、棱柱、棱锥、球体、圆锥等。根据每个软件包的不同这些体元也有所不同,在一些软件包中可以使用弯曲的物体进行 CSG 处理,在另外一些软件包中则不支持这些功能。构造物体就是将体元根据集合论的布尔逻辑组合在一起,这些运算包括:并集、交集以及补集。我们一般可以用 C