书架排书 逆序对

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

相关文章

排书 IDA*

原题链接 题目描述 给定 n 本书,编号为 1∼n。 在初始状态下,书是任意排列的。在每一次操作中,可以抽取其中连续的一段,再把这段插入到其他某个位置。我们的目标状态是把书按照== 1∼n 的顺序依次排列==。求最少需要多少次操作。 输入格式 第一行包含整数 T,表示共有 T 组测试数据。 每组数据包含两行,第一行为整数 n,表示书的数量。 第二行为 n 个整数,表示 1∼n 的一种任意排列

归并排序的应用—计算逆序对的个数

归并排序的应用—计算逆序对的个数 什么是逆序对题目的思路 题目 如果你还不会归并排序,那么请你先学会它,再来看本篇文章效果更佳。 什么是逆序对 逆序对的定义:在一个数列中,如果前面的数字大于后面的数字,那么这两个数字就构成了一个逆序对。 比如数列是这样的。 如果找 数字4 能够匹配成的逆序对,那么就有下列的这几对 如果找数字 9 匹配的,那么它后面的数字都比

按三角形逆序输入顶点来计算多边形面积

double fun(int x1,int y1,int x2,int y2,int x3,int y3) // 此处返回的面积有正负之分{double squre;squre=0.5*((x2-x1)*(y3-y1)-(y2-y1)*(x3-x1));return squre;} 具体的题目课参考 杭电OJ 题目出处: 杭电2036题

期末复习6--链表头插法(逆序)尾插法(顺序)---输出链表

头插法  #include <stdio.h>#include <stdlib.h>struct Node //定义结构体{char data; //数据域struct Node * next; //指针域};/* 请在这里填写答案 */void PrintList (struct Node * head){struct Node * s;if(hea

两个数字串 (顺序+逆序) 判断是否相等

来自poj3349 怎么比较    两个数字串  (顺序或逆序) 判断是否相等 bool is_Same(int a,int b) {     bool flag1,flag2;     for(int i=0;i<6;i++)  //判断顺序上是否相等     {         flag1=true;         for(int j=0;j<6;j++)

逆序队专题

逆序对的定义是,在一个数组中,对于下标 ( i ) 和 ( j )(其中 ( i < j )),如果 ( a[i] > a[j] ),则称 ((a[i], a[j])) 为数组的一个逆序对。 换句话说,逆序对就是在数组中前面的元素大于后面的元素的情况。例如,对于数组 ([3, 1, 2]),其中的逆序对有 ((3, 1)) 和 ((3, 2)),所以该数组有 2 个逆序对。 如何利用树状数组求

nyoj-550-三位数逆序输出

#include<stdio.h> int main() { char a,b,c; while(scanf("%c%c%c",&a,&b,&c)!=EOF) { getchar(); printf("%c%c%c\n",c,b,a); } return 0; }

牛客网刷题 | BC117 逆序输出

目前主要分为三个专栏,后续还会添加:         专栏如下:                 C语言刷题解析       C语言系列文章       我的成长经历 感谢阅读! 初来乍到,如有错误请指出,感谢! 描述 输入10个整数,要求按输入时的逆序把这10个数打印出来。逆序输出,就是按照输入相反的顺序打印这10个数。 输入描述: 一行,输入10个整数(范围-231~

hdu 4911 归并 求逆序对对数(Java实现)

网页链接 Inversion Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 1962    Accepted Submission(s): 765 Problem Description bobo ha

逆序对计算的思考 (Tsinghua OJ,PA1)

Tags:Blog 题目出自清华DSA的Programming Assignment作业灯塔(LightHouse). 描述 海上有许多灯塔,为过路船只照明。 如图一所示,每个灯塔都配有一盏探照灯,照亮其东北、西南两个对顶的直角区域。探照灯的功率之大,足以覆盖任何距离。灯塔本身是如此之小,可以假定它们不会彼此遮挡。 若灯塔A、B均在对方的照亮范围内,则称它们能够照亮彼此。比如