快速排序——封闭图形个数

news/2025/3/29 10:55:26/文章来源:https://www.cnblogs.com/foxt/p/18790462

封闭图形个数

题目描述

​ 在蓝桥王国,数字的大小不仅仅取决于它们的数值大小,还取决于它们所形成的“封闭图形”的个数。

​ 封闭图形是指数字中完全封闭的空间,例如数字 1、2、3、5、7 都没有形成封闭图形,而数字 0、4、6、9 分别形成了 1 个封闭图形,数字 8 则形成了 2个封闭图形。值得注意的是,封闭图形的个数是可以累加的。例如,对于数字68,由于 6 形成了 1 个封闭图形,而 8 形成了 2 个,所以 68 形成的封闭图形的个数总共为 3。

​ 在比较两个数的大小时,如果它们的封闭图形个数不同,那么封闭图形个数较多的数更大。例如,数字 41 和数字 18,它们对应的封闭图形的个数分别为 1 和 2,因此数字 41 小于数组 18。如果两个数的封闭图形个数相同,那么数值较大的数更大。例如,数字 14 和数字 41,它们的封闭图形的个数都是 1,但 14 < 41,所以数字 14 小于数字 41。如果两个数字的封闭图形个数和数值都相同,那么这两个数字被认为是相等的。

​ 小蓝对蓝桥王国的数字大小规则十分感兴趣。现在,他将给定你 n 个数a1, a2, . . . , an,请你按照蓝桥王国的数字大小规则,将这 n 数从小到大排序,并输出排序后结果。

输入格式

​ 输入的第一行包含一个整数 n ,表示给定的数字个数。

​ 第二行包含 n 个整数 a1, a2, . . . , an ,相邻整数之间使用一个空格分隔,表示待排序的数字。

输出格式

输出一行包含 n 个整数,相邻整数之间使用一个空格分隔,表示按照蓝桥王国的数字大小规则从小到大排序后的结果。

样例输入

3
18 29 6

样例输出

6 29 18

解题思路

快速排序方法,只需要将比较大小的方法进行更改即可。

代码

import java.util.Scanner;public class Main {//封闭图形个数public static final String graphic="1000101021";public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();//封闭图形个数String graphic="1000101021";String[] nums=new String[n];scanner.nextLine();for (int i = 0; i < n; i++) {nums[i]=scanner.next();}quickSort(nums, 0, n-1);for(int i=0;i<n;i++){System.out.print(nums[i]+' ');}}public static void quickSort(String[] nums, int low, int high) {if (low < high) {// 获取分区点索引int pi = partition(nums, low, high);// 递归排序左半部分quickSort(nums, low, pi - 1);// 递归排序右半部分quickSort(nums, pi + 1, high);}}private static int partition(String[] nums, int low, int high) {// 选择最后一个元素作为基准String pivot = nums[high];// 指向小于基准区域的最后一个元素int i = low - 1;// 遍历数组,将小于基准的元素交换到左侧区域for (int j = low; j < high; j++) {if (compare(pivot,nums[j])) {i++;// 交换元素swap(nums, i, j);}}// 将基准元素放到正确位置swap(nums, i + 1, high);return i + 1; // 返回基准的最终位置}public static void swap(String[] nums,int i,int j){String temp;temp=nums[i];nums[i]=nums[j];nums[j]=temp;}//比较两数大小public static boolean compare(String a,String b){int a_graphic=0,b_graphic=0;for(int i=0;i<a.length();i++){a_graphic+=graphic.charAt(a.charAt(i)-'0')-'0';}for(int i=0;i<b.length();i++){b_graphic+=graphic.charAt(b.charAt(i)-'0')-'0';}if(a_graphic==b_graphic){int a_num=Integer.parseInt(a),b_num=Integer.parseInt(b);return a_num>=b_num;}elsereturn a_graphic>=b_graphic;}
}

快速排序代码模板

//快速排序主方法
public static void quickSort(int[] arr, int low, int high) {if (low < high) {// 获取分区点索引int pi = partition(arr, low, high);// 递归排序左半部分quickSort(arr, low, pi - 1);// 递归排序右半部分quickSort(arr, pi + 1, high);}
}//分区函数
private static int partition(int[] arr, int low, int high) {// 选择最后一个元素作为基准int pivot = arr[high];// 指向小于基准区域的最后一个元素int i = low - 1;// 遍历数组,将小于基准的元素交换到左侧区域for (int j = low; j < high; j++) {if (arr[j] <= pivot) {i++;// 交换元素swap(arr, i, j);}}// 将基准元素放到正确位置swap(arr, i + 1, high);return i + 1; // 返回基准的最终位置
}
//交换元素
private static void swap(int[] arr, int i, int j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;
}

Java交换数组元素

java交换数组元素时可以直接使用的原因,即与C语言的差别。

C语言中的数组传递

  1. 数组退化为指针
    在C语言中,数组作为函数参数时,会退化为指向首元素的指针(如int arr[]等价于int *arr)。函数内部接收到的是数组的内存地址,通过指针可以直接修改原数组的内容。
  2. 无法直接交换数组本身
    若需交换两个数组(如交换int a[10]int b[10]),需通过指针的指针(如int **),因为直接传递数组名只能修改数组元素,无法修改数组变量本身的指向。
  3. 元素交换需指针操作
    交换数组元素必须通过指针或下标访问内存地址,例如:
void swap(int *a, int *b) {int temp = *a;*a = *b;*b = temp;
}
// 调用:swap(&arr[i], &arr[j]);

Java中的数组传递

  1. 数组是对象,传递引用副本
    Java中的数组是对象,存储在堆中。方法参数传递的是数组对象的引用(内存地址)的副本。虽然引用本身是副本,但它与原引用指向同一对象,因此可以直接修改数组元素。

  2. 直接通过引用操作元素
    在方法中通过形参(如int[] arr)修改元素(如arr[i] = x),实际是修改堆中的原数组对象,因此无需显式使用指针语法:

void swap(int[] arr, int i, int j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;
}
  1. 无法修改原引用指向
    如果尝试在方法内让形参指向新数组(如arr = new int[10];),只会修改引用副本,原数组引用不受影响。

关键区别

特性 C语言 Java
参数传递本质 传递数组首元素指针 传递数组对象引用的副本
能否直接修改元素 是(通过指针) 是(通过引用副本访问堆对象)
能否交换数组本身 需指针的指针(int ** 不能(只能交换元素)
语法显式性 需显式使用指针操作 隐藏指针,语法更简洁

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/905065.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Netty源码—5.Pipeline和Handler

大纲 1.Pipeline和Handler的作用和构成 2.ChannelHandler的分类 3.几个特殊的ChannelHandler 4.ChannelHandler的生命周期 5.ChannelPipeline的事件处理 6.关于ChannelPipeline的问题整理 7.ChannelPipeline主要包括三部分内容 8.ChannelPipeline的初始化 9.ChannelPipeline添加…

A important person

When I saw this title,the first “person” that came to mind was my little sister, my puppy dog called LaiBao. I still remember the first day I saw her. My mom bought it on internet and the solder took her to us. She was too small at that time. She curled…

模型2汇率的数据预处理环节

数据来源:中国银行官网 数据项:货币名称【欧元】、汇率、时间 数据预处理围绕四个方面展开:重复值、异常值、归一化、缺失值 由于数据来源于官方网站,本身不存在缺失值及异常值,通过观察样本数据可知,数据的波动范围在7.800~8.000之间【数据保存三位小数】,波动范围较小…

SciTech-EECS-Circuits-AGC(Auto Gain Control, 自动增益控制)电路 的几种方式对比: 响应时问、精度、动态范围、线性度、稳定度

参考 https://www.elecfans.com/article/83/116/2010/20101201227060.html AGC 的几种方式"误差放大器" 的 AGC(自动增益控制): 放大量小了,稳压效果不好,放大量大了,容易自激。 AGC重点参数: 响应时问、精度、动态范围、线性度、稳定度.用“直流电压负反馈方式”…

昆明理工大学25冶金工程考研预计调剂169人

--冶金工程考研809冶金物理化学有色冶金学有色金属冶金冶金过程及设备F002钢铁冶金学冶金调剂

平衡树-入门

本文有一只奶龙编写,有借鉴会在其中说明。 平衡树 要了解平衡树是什么,我们需要先了解一个东西:二叉搜索树(也称二叉查找树)。二叉搜索/查找树(BST)如果我们有一颗二叉树可以进行查找,那么就可以说明其中的节点一定又有一个能够区分大小的“键值”。我们有节点来存储这…

安卓工程目录结构

根目录 根目录下有多个重要的文件和文件夹,各自承担着不同的功能。.gradle 和 .idea 这两个文件夹属于 IDE(集成开发环境)生成的文件,其中 .gradle 包含 Gradle 构建系统的配置和缓存信息;.idea 则是 IntelliJ IDEA 或者 Android Studio 所产生的项目配置文件。 app 这是安…

LLM大模型:post-train实战 - 使用GRPO微调LLM

deepseek带火了GRPO,更带火了reinforcement learning,让研究人员发现RL能在pre-train的基础上较大提升LLM的逻辑推理能力!当前,互联网高速发展二十多年产生的优质数据已经使用殆尽,所以更大规模的LLM一直难产(GPT-5现在都还没发布,优质token耗尽是核心原因之一)。市面上…

MQ 消息幂等性保证

MQ 消息幂等性保证 1. 什么是幂等性 在程序开发中,是指同一个业务,执行一次或多次对业务状态的影响是一致的。例如:根据 id 删除数据 查询数据在实际业务中,避免不了出现用户连续点击退款、重复点击删除等情况,这种情况下,就需要对多个消息进行处理,避免短时间内多次执行…

3.24 曲线/曲面积分

1 第一类曲线积分 (理解成求曲线的质量) 要把ds(弧微分)转化成dt(参数方程里面的自变量)(积分里面只留下的变量),也可以转化成dx什么的,注意ds转化成dx的公式 2 第一类曲面积分 还是先求投影,比如投影到xoy平面上,就求z=z(x,y) 2.1 普通对称性奇函数为0,偶函数*2 2.…

SmolVLM2: 让视频理解能力触手可及

一句话总结: SmolVLM 现已具备更强的视觉理解能力📺 SmolVLM2 标志着视频理解技术的根本性转变——从依赖海量计算资源的巨型模型,转向可在任何设备运行的轻量级模型。我们的目标很简单: 让视频理解技术从手机到服务器都能轻松部署。 我们同步发布三种规模的模型 (22 亿/5 亿…

React-Native开发鸿蒙NEXT-video

React-Native开发鸿蒙NEXT-video 前几周的开发,基本把一个”只读型“社区开发的差不多了。帖子列表,详情,搜索都迁移实现了,但还差了一点------视频类型帖子的展示。之前开发RN社区中,对于视频的处理用的是react-native-video,这个三方组件也已经实现了鸿蒙化,部分逻辑可…