【拆盲盒02】算法题

题目 :

假设顺序表L中的元素按从小到大的次序排列,编写算法删除顺序表中“多余”的数据元素,即操作之后的顺序表中所有元素的值都不相同,要求时间尽可能的少;并对顺序表A(1,1,2,2,2,3,4,5,5,5,6,6,7,7,8,8,8,9)模拟执行本算法,并统计移动元素的次数。

我一开始看见这个题的时候,第一时间想到了"序列去重",然后自然而然想到了使用哈希表哈哈哈,然后这道题就被我搞复杂了,我的复杂思路如下,不建议采用我这种方式解题哦~

要在Java中去除顺序表中的重复元素而不改变元素的原始顺序,可以结合使用哈希表(或HashSet)和ArrayList。HashSet用于追踪已经出现过的元素,而ArrayList用于存储去除重复后的元素。这个方法保持了元素的原始顺序并且去除了重复项。

同时,这个方法的时间复杂度是O(n),其中n是输入数组的长度,因为每个元素只被遍历一次。由于HashSet的添加和查找操作通常是O(1)的,因此这种方法是高效的。

以下就是一个Java代码实现上述的逻辑 :

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;public class RemoveDuplicates {public static void main(String[] args) {// 示例数组int[] nums = {122223455566778889};// 调用函数去除重复元素List<Integer> result = removeDuplicates(nums);// 打印结果for (int num : result) {System.out.print(num + " ");}}public static List<Integer> removeDuplicates(int[] nums) {Set<Integer> seen = new HashSet<>();List<Integer> result = new ArrayList<>();for (int num : nums) {if (!seen.contains(num)) {seen.add(num);result.add(num);}}return result;}}

要实现移动元素计数的功能,我们可以引入一个计数器变量来跟踪添加到result数组中的每个元素。每当我们向result中添加一个元素时,就增加这个计数器的值。

  • 问: 为什么移动元素的次数就是最后元素的个数 ?

    • 答 : 移动元素的次数与最终元素的个数相同的原因在于你的算法实际上是在创建一个新的列表(result),并将原列表(arrayList)中未重复的元素“移动”到这个新列表中。在这个过程中,每当你遇到一个尚未存在于HashSet中的元素,你就将它添加到result中。这个添加操作可以被视作是一次“移动”。
    • 这里的“移动”是一个比喻。在实际编程中,你并没有从原列表中删除元素再添加到新列表中,而是在新列表中创建了一个元素的副本。但从逻辑上讲,你可以将这个过程视为“移动”一个元素,因为每个元素最终都从原始位置(在arrayList中)“移动”到了新位置(在result中)。
    • 因此,每添加一个新元素到result中,实际上就是完成了一次“移动”,而最终result中元素的总数即为移动元素的次数。这也是为什么移动元素的次数等于最终元素的个数。

 

如下 : 修正后的代码(加上了计数器)

public static void removeDuplicates(ArrayList<Integer> arrayList){HashSet<Integer> key = new HashSet<>();ArrayList<Integer> result = new ArrayList<>();int moveCount = 0;for (int num : arrayList) {if (!key.contains(num)) {key.add(num);result.add(num);moveCount++; // 增加移动次数}}System.out.println("移动元素的次数: " + moveCount);for (int num : result) {System.out.print(num + " ");}
}

最后我就去搜罗搜罗,发现了非常非常巧妙的方法,没有使用额外的空间,仅仅在原数组上面进行操作就完成了对序列去重的操作,而且还没有改变序列中各个元素的顺序,Java代码如下,光看下面的这几行代码,感觉不是非常直观,所以我还是用图把这个逻辑实现出来,这样理解起来也会更加的容易~

先来对这个代码进行一个逻辑上的解释,我们要知道,这个方法只能用在特定的场景,也就是只能拿来解特定的题目,这里的数组A必须是已经有序的才可以使用.

  1. 循环遍历: 使用一个循环来遍历数组 A 的每个元素。
  2. 去重判断: 通过判断 A[i] != A[i - 1]来识别是否有重复的元素。这意味着,这个方法假设数组 A 已经是排序过的。如果数组 A 未排序,这个判断将不准确。
  3. 元素复制: 如果发现一个不重复的元素(或者是数组的第一个元素),它会被复制到数组的 t索引位置。
  4. 返回值: 返回 t,即不重复元素的数量。

图示

一步一步拆解的示意图

image-20240101021048429

Java代码

public int distinct(int[] A) {int t = 0;for (int i = 0; i < A.length; i++) {if (i == 0 || A[i] != A[i - 1]) A[t++] = A[i];}return t;
}

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

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

相关文章

跳圈圈^^

欢迎来到程序小院 跳圈圈 玩法&#xff1a;女骑士点击左下按钮越过低处火圈&#xff0c;点击右下按钮越过高处火圈&#xff0c;越过火圈获得分数&#xff0c;快去挑战吧^^。开始游戏https://www.ormcc.com/play/gameStart/235 html <div id"loadicon"><im…

WeNet语音识别调用通义千问

WeNet语音识别调用通义千问 WeNet语音识别对通义千问&#xff08;Qwen-72B-Chat Bot&#xff09;调用&#xff0c;首先通过WeNet将用户的语音输入转录为文本&#xff0c;然后将此文本输入通用问答模型以获取答案。 本人原创作品&#xff0c;体验一下 连续对话 WeNet语音识别…

数据结构【线性表篇】(一)

数据结构【线性表篇】(一&#xff09; 文章目录 数据结构【线性表篇】(一&#xff09;前言为什么突然想学算法了&#xff1f;为什么选择码蹄集作为刷题软件&#xff1f; 目录一、顺序表(一)、顺序表的定义(二)、顺序表的插入删除(三)、顺序表的查找 二、完整代码(一)、顺序表的…

Mybatis行为配置之Ⅰ—缓存

专栏精选 引入Mybatis Mybatis的快速入门 Mybatis的增删改查扩展功能说明 mapper映射的参数和结果 Mybatis复杂类型的结果映射 Mybatis基于注解的结果映射 Mybatis枚举类型处理和类型处理器 再谈动态SQL Mybatis配置入门 Mybatis行为配置之Ⅰ—缓存 Mybatis行为配置…

2023-12-25 LeetCode每日一题(不浪费原料的汉堡制作方案)

2023-12-25每日一题 一、题目编号 1276. 不浪费原料的汉堡制作方案二、题目链接 点击跳转到题目位置 三、题目描述 圣诞活动预热开始啦&#xff0c;汉堡店推出了全新的汉堡套餐。为了避免浪费原料&#xff0c;请你帮他们制定合适的制作计划。 给你两个整数 tomatoSlices …

UDP套接字搭建简易服务器与客户端

使用UDP套接字搭建 文章目录 使用UDP套接字搭建前言一、基本结构二、使用步骤1.服务器端2.客户端 三、效果展示总结 前言 这次较上个版本《Python 网络编程之搭建简易服务器和客户端》https://only-me.blog.csdn.net/article/details/135251171增加了&#xff1a; UDP协议来进…

文献阅读:LoRA: Low-Rank Adaptation of Large Language Models

文献阅读&#xff1a;LoRA: Low-Rank Adaptation of Large Language Models 1. 文章简介2. 方法介绍3. 实验 & 结论 1. 基础实验 1. Bert系列模型2. GPT系列模型 2. 消解实验 1. 作用矩阵考察2. 中间维度考察3. 扰动程度分析 4. 总结 & 思考 文献链接&#xff1a;htt…

如何下载Sentinel-1数据

Sentinel-1是欧洲空间局&#xff08;ESA&#xff09;的一组地球观测卫星&#xff0c;属于Copernicus计划的一部分。该计划旨在为全球环境监测提供数据&#xff0c;并支持应对气候变化、自然灾害和人类活动的挑战。Sentinel-1卫星的主要任务是提供全天候、全时段、高分辨率的合成…

MySQL数据库学习一

1 什么是数据库的事务&#xff1f; 1.1 事务的典型场景 在项目里面&#xff0c;什么地方会开启事务&#xff0c;或者配置了事务&#xff1f;无论是在方法上加注解&#xff0c;还 是配置切面。 <tx:advice id"txAdvice" transaction-manager"transactionMa…

「Verilog学习笔记」乘法与位运算

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 观察乘数的特点&#xff1a; 1111_1011 1_0000_0000 - 1 - 100 timescale 1ns/1nsmodule dajiang13(input [7:0] A,output [15:0] B);//*************code*********…

Python从入门到精通之线程与进程

系列 Python从入门到精通之安装与快速入门-CSDN博客 Python从入门到精通之基本数据类型和变量-CSDN博客 Python从入门到精通之集合&#xff08;List列表、Tuple元组、Dict字典、Set&#xff09;-CSDN博客 Python从入门到精通之条件语句、循环语句和函数-CSDN博客 Python从…

二叉树的后序遍历,力扣

目录 建议先刷一下中序遍历 题目地址&#xff1a; 题目&#xff1a; 我们直接看题解吧&#xff1a; 解题方法&#xff1a; 注&#xff1a; 解题分析&#xff1a; 解题思路&#xff1a; 代码实现&#xff1a; 代码实现&#xff08;递归&#xff09;&#xff1a; 代码实现&#x…