【拆盲盒02】算法题

news2025/1/17 13:53:20

题目 :

假设顺序表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.coloradmin.cn/o/1348583.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【js】js解析Token:

一、效果&#xff1a; 二、实现&#xff1a; export function getTokenObject(token) {//通过split()方法将token转为字符串数组,数组中的第二个字符进行解析return token ? JSON.parse(decodeURIComponent(escape(window.atob(token.split(".")[1].replace(/-/g &…

在 Spring 中操作 Redis

&#x1f9f8;欢迎来到dream_ready的博客&#xff0c;&#x1f4dc;相信您对博主首页也很感兴趣o (ˉ▽ˉ&#xff1b;) &#x1f4dc;redis和缓存及相关问题和解决办法 什么是缓存预热、缓存穿透、缓存雪崩、缓存击穿 目录 1、引入依赖 2、对 Redis 的配置文件进行书写 3、S…

2022年中职组“网络安全”赛项湖南省B-3——私钥泄漏

B-3&#xff1a;应用服务漏洞扫描与利用 任务环境说明&#xff1a;需要环境有问题可以加q 服务器场景&#xff1a;Server15服务器场景操作系统&#xff1a;未知&#xff08;关闭链接&#xff09; 使用命令nmap探测目标靶机的服务版本信息&#xff0c;将需要使用的参数作为FLA…

UIToolKit使用心得

起因 因为那个uitoolkit自己写了一套graphView&#xff0c;所以想着来用用但是用完之后发现也不过如此 怎么构建自己的组件 我在继承Node之后想修改node的样式该怎么办呢是这样的。先用pick点击默认的node节点元素- 在pick默认创建的node节点之后&#xff0c;可以把它的uxml…

【产品设计】信息建设三驾马车:PLM系统拆解

本篇文章将介绍PLM的基础信息、发展及模块功能等内容&#xff0c;让大家对PLM有一个全面、完整地了解&#xff0c;方便在后期的工作中能快速地使用其解决方案&#xff0c;希望本篇文章能对你有所帮助。 PLM系统主要实现产品模块业务&#xff0c;既包含产品的创意设计、样品打样…

阶段十-分布式-docker虚拟化容器

第一章 Docker简介 1.2 节 Docker理念 Docker是基于Go语言实现的云开源项目&#xff1b;通过对应用组件的封装、分发、部署、运行等生命周期的管理&#xff0c;使用户的APP&#xff08;可以是一个WEB应用或数据库应用等等&#xff09;及其运行环境能够做到“一次封装&#xf…

《PCI Express体系结构导读》随记 —— 第I篇 第1章 PCI总线的基本知识(18)

接前一篇文章&#xff1a;《PCI Express体系结构导读》随记 —— 第I篇 第1章 PCI总线的基本知识&#xff08;17&#xff09; 1.4 PCI总线的中断机制 1.4.2 中断信号与PCI总线的连接关系 在PCI总线中&#xff0c;INTx信号属于边带信号。所谓边带信号是指这些信号在PCI总线环境…

错题总结五

一. 操作访问字节个数问题 这道题考察的是指针有关的知识&#xff0c;而这种指针的知识我们提到过 指针相关知识(入门)-CSDN博客 指针相关知识(进阶)-CSDN博客 在这里&#xff0c;我们复习一下。在指针里&#xff0c;int有4个字节&#xff0c;short有2个字节&#xff0c;换句…

jsp作用域

jsp四大域对象 page 只在当前页面有效&#xff0c;跳转后无效 request 服务器跳转有效&#xff0c;客户端发生跳转无效&#xff0c;&#xff08;因为客户端跳转&#xff0c;相当于发生两次跳转&#xff09; session 保存在浏览器会话中&#xff0c;服务器或客户端跳转均有…

Spring系列:Spring如何解决循环依赖

❤ 作者主页&#xff1a;欢迎来到我的技术博客&#x1f60e; ❀ 个人介绍&#xff1a;大家好&#xff0c;本人热衷于Java后端开发&#xff0c;欢迎来交流学习哦&#xff01;(&#xffe3;▽&#xffe3;)~* &#x1f34a; 如果文章对您有帮助&#xff0c;记得关注、点赞、收藏、…

【ChatGPT 默认强化学习策略】PPO 近端策略优化算法

PPO 近端策略优化算法 PPO 概率比率裁剪 演员-评论家算法演员-评论家算法&#xff1a;多智能体强化学习核心框架概率比率裁剪&#xff1a;逐步进行变化的方法PPO 目标函数的设计重要性采样KL散度 PPO 概率比率裁剪 演员-评论家算法 论文链接&#xff1a;https://arxiv.org…

万字长文谈自动驾驶occupancy感知

文章目录 prologuepaper listVision-based occupancy :1. [MonoScene: Monocular 3D Semantic Scene Completion [CVPR 2022]](https://arxiv.org/pdf/2112.00726.pdf)2. [Tri-Perspective View for Vision-Based 3D Semantic Occupancy Prediction [CVPR 2023]](https://arxiv…

Android--Jetpack--Paging详解

不尝世间醋与墨&#xff0c;怎知人间酸与苦。 择一业谋食养命&#xff0c;等一运扭转乾坤。 你见过哪些令你膛目结舌的代码技巧&#xff1f; 文章目录 不尝世间醋与墨&#xff0c;怎知人间酸与苦。择一业谋食养命&#xff0c;等一运扭转乾坤。你见过哪些令你膛目结舌的代码技…

03.QT命名规范及快捷键(部分)

一、命名规范 1.类名 大驼峰规则&#xff1a;首字母大写&#xff0c;单词和单词之间首字母大写。 2.变量名 小驼峰规则&#xff1a;首字母小写&#xff0c;单词和单词之间首字母大写。 二、快捷键 1.代码操作相关 注释&#xff1a;ctrl / 运行&#xff1a;ctrl r 编译…

GPT4-AIl本地部署-chat AI本地使用

文章目录 GPT4-AIl本地部署GPT4客户端下载地址&#xff1a;对应的下载下载后的文件点击安装&#xff0c;改一下文件存放路径&#xff0c;下面都是默认下一步进度条100%后&#xff0c;点击完成 安装完桌面生成图标&#xff0c;点击选择都是NO&#xff0c;不进行数据上传点击后&a…

开源数据集的获取不该成为你的阻塞项

B站&#xff1a;啥都会一点的研究生公众号&#xff1a;啥都会一点的研究生 当可获取的数据有限&#xff0c;公共的开源数据集将是不错的选择 很多人并不知道该如何获取最权威的官方数据&#xff0c;亦或是不清楚有哪些数据集能为之所用&#xff0c;最适合自己的任务场景 不用…

js遍历后端返回的集合将条件相同的放入同一个数组内

项目场景&#xff1a; echarts折线图需要根据条件动态展示多条不同曲线 解决方案&#xff1a; 后端直接将使用sql将数据查询出来返回即可,因为我这里不是Java使用的C#不是很熟练后台不好写逻辑,所以在前端js完成的 代码如下: function createline(villagename, buildingname…

构建安全的SSH服务体系

1、配置OpenSSH服务端 在CentOS7.3系统中&#xff0c;OpenSSH服务由openssh、openssh-server等软件包提供&#xff08;默认已安装&#xff09;&#xff0c;并已将sshd添加为标准的系统服务。执行"systemctl start sshd"命令即可启动sshd服务。ssh服务的配置文件默认位…

前端:html+css+js实现CSDN首页

提前说一下&#xff0c;只实现了部分片段哈&#xff01;如下&#xff1a; 前端&#xff1a;htmlcssjs实现CSDN首页 1. 实现效果2. 需要了解的前端知识3. 固定定位的使用4. js 监听的使用4. 参考代码和运行结果 1. 实现效果 我的实现效果为&#xff1a; 原界面如下,网址为&…

按照故障码类型分类的API接口

随着汽车的普及&#xff0c;车辆故障也成为了一个不可忽视的问题。对于车主来说&#xff0c;及时了解故障码的含义以及解决方案十分重要。挖数据平台为解决这一问题&#xff0c;提供了一套按照故障码类型分类的API接口&#xff0c;用于查询车辆故障、故障码适用品牌以及提供相应…