双指针的使用

news/2025/1/15 20:03:09/文章来源:https://www.cnblogs.com/moon-new-star/p/18405091

双指针-在原来的数组上修改元素(应用于)

左指针不动,右指针移动,当移动到与左指针不同的元素时,左指针移动一位,将那位的元素改为右指针的值;随后,右指针继续移动。

public static int removeDuplicates(int[] nums){//双指针int num = 0;for (int i = 1; i < nums.length; i++) {if (nums[num] != nums[i]){num++;nums[num] = nums[i];}}return num + 1;}
  • 利用++left,更简洁

    //双指针解决public int removeDuplicates(int[] A) {//边界条件判断if (A == null || A.length == 0)return 0;int left = 0;for (int right = 1; right < A.length; right++)//如果左指针和右指针指向的值一样,说明有重复的,//这个时候,左指针不动,右指针继续往右移。如果他俩//指向的值不一样就把右指针指向的值往前挪if (A[left] != A[right])A[++left] = A[right];return ++left;}// 作者:数据结构和算法
// 链接:https://leetcode.cn/leetbook/read/top-interview-questions-easy/x2gy9m/?discussion=4Zkrel
// 来源:力扣(LeetCode)
// 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 另外一种解法

    public int removeDuplicates(int[] A) {int count = 0;//重复的数字个数for (int right = 1; right < A.length; right++) {if (A[right] == A[right - 1]) {//如果有重复的,count要加1count++;} else {//如果没有重复,后面的就往前挪A[right - count] = A[right];}}//数组的长度减去重复的个数return A.length - count;}// 作者:数据结构和算法
// 链接:https://leetcode.cn/leetbook/read/top-interview-questions-easy/x2gy9m/?discussion=4Zkrel
// 来源:力扣(LeetCode)
// 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

扩展

  • 保留插入顺序的集合:LinkedHashSet类

要创建一个保留元素插入顺序的集合,你可以使用 LinkedHashSet 类。LinkedHashSetHashSet 的子类,但它维护了一个运行于所有条目的双重链接列表,这使得迭代顺序与插入顺序相同。下面是使用 LinkedHashSet 创建并操作一个集合的示例:

import java.util.LinkedHashSet;
import java.util.Set;public class OrderedSetExample {public static void main(String[] args) {// 创建一个 LinkedHashSetSet<String> orderedSet = new LinkedHashSet<>();// 添加一些元素orderedSet.add("Apple");orderedSet.add("Banana");orderedSet.add("Cherry");orderedSet.add("Banana"); // Banana 已经存在,所以这个调用不会改变集合// 集合中的元素将按照插入顺序排列System.out.println("LinkedHashSet: " + orderedSet);// 向集合中添加一个新元素orderedSet.add("Date");// 打印更新后的集合,可以看到 Date 被添加到了最后System.out.println("Updated LinkedHashSet: " + orderedSet);}
}

输出将如下所示:

LinkedHashSet: [Apple, Banana, Cherry]
Updated LinkedHashSet: [Apple, Banana, Cherry, Date]

如你所见,尽管尝试添加了重复的 "Banana",但 LinkedHashSet 只保存了一个 "Banana" 实例,并且集合中的元素按照它们被插入的顺序列出。

  • HashSet和TreeSet的插入顺序:

HashSetTreeSet 在 Java 中都是 Set 接口的实现,它们都保证了集合中元素的唯一性,但是它们存储和检索元素的方式不同,这影响了元素的顺序:

  • HashSet
    HashSet 是基于哈希表的数据结构。它使用哈希函数将元素映射到哈希表中的特定位置。由于哈希函数的结果可能相同(哈希冲突),HashSet 使用链表或平衡树等数据结构解决冲突,但这并不意味着元素会按照插入顺序保存。因此,HashSet 中元素的顺序是不确定的,通常与元素的哈希值和哈希表的内部结构有关。也就是说,HashSet 不保证元素的任何特定顺序,无论是插入顺序还是其他顺序。

  • TreeSet
    相比之下,TreeSet 是基于红黑树的数据结构。它会根据元素的自然顺序(通过 Comparable 接口)或者用户提供的比较器(通过 Comparator 接口)对元素进行排序。因此,TreeSet 中的元素总是按照某种顺序排列的,这个顺序取决于元素的比较方式。当你向 TreeSet 中添加元素时,元素会被插入到适当的位置以保持树的排序属性。这意味着 TreeSet 不会保留元素的插入顺序,而是按照排序规则自动调整元素的位置。

总结来说:

  • 如果你需要一个快速的、元素唯一的集合,而且元素的顺序无关紧要,那么你应该选择 HashSet
  • 如果你需要一个元素唯一的集合,并且这些元素必须按照一定的顺序(通常是自然顺序或定义的顺序)排列,那么你应该选择 TreeSet

如果你想保留元素的插入顺序,你可以使用 LinkedHashSet,它是 HashSet 的子类,使用链表链接所有的节点,从而在保持元素唯一性的同时,也保留了元素的插入顺序。

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

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

相关文章

机器学习作业

Ch3-K均值聚类算法 【9月4日】 学号:102102156 姓名:高涛 1. make_circles方法生成数据 1.1 源代码 from sklearn.cluster import KMeans from sklearn.datasets import make_circles, make_moons, make_blobs import matplotlib.pyplo…

volta 管理多个node版本时,Volta error: Could not download node

设置代理 在终端中执行以下命令,替换为你自己的代理地址: bash $env:HTTP_PROXY="你的代理地址" $env:HTTPS_PROXY="你的代理地址" 然后重启终端: Windows 用户需要以管理员身份重新打开终端。 Mac 用户只需重启终端即可。 这样可以确保你在终端中通过代…

el-upload点击问题

问题描述: 今天在写vue项目时,用到了element plus中的el-upload组件,发现这么一个问题: 组件各个功能都是正常的,也可以上传图片,但是 虚线框里那么大一片区域只有中间那个十字是可以点击的点击查看代码 <el-uploadclass="ImageUpload":action="http:/…

P2424

1.逃课做法 第一眼看到: 感觉有点像内啥分解只因数 然后就不会了那我写这个干什么 这时,聪明的我们就想到了打表 怎么打呢? 如图:我们可以把它分成几个块,提前打好每个块的答案 这样,我们就用普及的算法过了提高的题 2.正解 氧化钙(CaO)的怎么和上题一样 #include<c…

BinLLM论文阅读笔记

Text-like Encoding of Collaborative Information in Large Language Models for Recommendation论文阅读笔记 Abstract 现存的问题: ​ 在调整用于推荐的大型语言模型(LLMRec)时,整合协作信息至关重要。现有的方法通过从头开始学习 LLM 潜在空间中的协作嵌入或通过外部模…

线上问题排查-定时任务状态未复位

项目业务 用户授权登录后,负责把本 app 的运动同步到第三方,分别对接了 A、B、C、D 等第三方,各个平台的推送方式不太一样,有一些是主动查询,有一些是主动推送 场景 周五线上 Redis 报了内存不足,代码排查后发现用户数据占用了很大一部分,并且只存储不查询也不设置过期事…

java基础 -线程(基础)的 笔记

581,多线程机制 因为需要敌人的坦克可以自由移动并发射子弹,我们的坦克可以移动并发射子弹,这些要用到线程的知识。根据JConsole监控线程执行情况,发现,主线程执行完了,子线程还没有执行完,并不能表示当前进程死亡了,只有当所有的子线程执行完了,主进程才会结束。真正…

Leangoo领歌:一站式敏捷缺陷管理平台,助力产品迭代

在敏捷开发环境下,缺陷管理的效率直接影响到项目的质量和交付周期。对于追求高效、透明和灵活的敏捷团队来说,Leangoo领歌无疑是一个不可或缺的工具。​在开发过程中,缺陷(BUG)管理一直是项目管理中的一个关键环节。及时发现并修复BUG,不仅能够提高产品质量,还能有效提升…

手写数字识别总结

项目介绍:每张图片都是28*28的像素1,使用全连接层 图像拆分成一维像素阵列作为输入值,输入到神经网络中。打包多个图像输入称为一个batch2,输出数据需要做归一化,使数据概率在0-1之间3,一个batch_size设置为15,共训练两次 通过调节a和b,使训练值与真实值的误差减小,形…

h5新特性

新增语义化标签header:整个页面或部分区域的头部footer:整个页面,或者部分区域的底部nav:导航article:文章、帖子、杂志、博客、评论等section:页面中的某段文字或者文章中的某段文字aside:侧边栏main:文档的主要内容,(WHATWG没有语义,IE不支持)hgroup:包裹连续的标题,如文章…

Python存储与读写二进制文件

本文介绍了一种在Python中将Numpy数组转存为一个紧凑的二进制格式的文件,及其使用内存映射的形式进行读取的方案。一个二进制的数据流,不仅可以更加方便页形式的内存映射,相比于传统的Numpy单精度浮点数数组还有一个可哈希的特性。总体来说是一个对于高性能计算十分友好的存…