首页 > 其他分享 >双指针的使用

双指针的使用

时间:2024-09-09 18:46:31浏览次数:8  
标签:right LinkedHashSet int 元素 顺序 使用 指针

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

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

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要加1
                count++;
            } 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) {
        // 创建一个 LinkedHashSet
        Set<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 的子类,使用链表链接所有的节点,从而在保持元素唯一性的同时,也保留了元素的插入顺序。

标签:right,LinkedHashSet,int,元素,顺序,使用,指针
From: https://www.cnblogs.com/moon-new-star/p/18405091

相关文章

  • 使用Redis来处理高并发问题
    设计理念:限流:鉴于只有少部分用户能够秒杀成功,所以要限制大部分流量,只允许少部分流量进入服务后端。削峰:对于秒杀系统瞬时会有大量用户涌入,所以在抢购一开始会有很高的瞬间峰值。高峰值流量是压垮系统很重要的原因,所以如何把瞬间的高流量变成一段时间平稳的流量也是设计秒杀系统......
  • 使用jQuery实现按钮置灰不可用效果
    使用jQuery实现按钮置灰不可用效果在Web开发中,有时候我们需要在特定情况下将按钮置灰并设置为不可用状态,以防止用户重复点击或者暂时禁止某些操作。本文将介绍如何使用jQuery来实现这一效果。HTML结构首先,我们先创建一个简单的按钮和一个触发按钮置灰的事件按钮,示例代码如下:htmlCop......
  • C++: set与map容器的介绍与使用
    本文索引前言1.二叉搜索树1.1概念1.2二叉搜索树操作1.2.1查找与插入1.2.2删除1.2.3二叉搜索树实现代码2.树形结构的关联式容器2.1set的介绍与使用2.1.1set的构造函数2.1.2set的迭代器2.1.3set的容量2.1.4set的修改操作2.2map的介绍与使用2.2.1map的构造......
  • 京东鸿蒙上线前瞻——使用 Taro 打造高性能原生应用
    背景2024年1月,京东正式启动鸿蒙原生应用开发,基于HarmonyOSNEXT的全场景、原生智能、原生安全等优势特性,为消费者打造更流畅、更智能、更安全的购物体验。同年6月,京东鸿蒙原生应用尝鲜版上架华为应用市场,计划9月完成正式版的上架。早在2020年,京东与华为就签署......
  • mybaties-plus使用@SelectProvider实现动态SQL
    mybaties-plus使用@SelectProvider实现动态SQL新建DynamicSqlProvider.java类packagecom.muphy.mapper;importorg.apache.ibatis.jdbc.SQL;importjava.util.*;publicclassDynamicSqlProvider{publicStringbuildSelectSql(Map<String,Object>params){......
  • C#-使用Serilog框架快速实现日志及其相关扩展
    目录一、Serilog日志实现1、实现 ILogEventSink接口2、日志类Log3、日志级别LogLevel 4、ILogger接口5、日志服务实现6、日志视图View7、ViewModel二、功能扩展1、日志扩展方法2、Trace追踪扩展日志3、自动滚动至底部一、Serilog日志实现安装NuGet包:Serilog......
  • 客户案例 | 使用 BigQuery 和 AutoML 消除电视行业的数据孤岛和分散
    在这个客户案例中,我们会介绍一家大众媒体公司如何利用BigQuery和AutoML消除数据孤岛和分散。通过参考真实的GoogleCloud案例研究,我们总结了GoogleCloud的服务和产品如何使客户的业务受益。客户所属行业:广告媒体项目期间引入的GoogleCloud产品和配置列表:BigQuery:数......
  • 使用ChainLink预言机聚合器合约
    有了使用Hardhatforking功能模拟主网的基础,我们来看一下如何在链上使用预言机聚合器合约来获取某个数字资产当前价格。代码https://solidity-by-example.org/defi/chainlink-price-oracle///SPDX-License-Identifier:MITpragmasolidity^0.8.24;contractChainlinkPrice......
  • FastAPI 深度指南:使用依赖注入处理分页和过滤逻辑
    在FastAPI框架中,Depends是一个关键的功能,它允许开发者通过依赖注入来管理和重用代码。这在处理API的分页和过滤逻辑时尤其有用,因为它可以将这些逻辑抽象化,从而减少冗余代码并提高效率。通过Depends,我们可以定义一个函数,该函数负责获取和验证分页参数(如skip和limit)以及过滤参数(如基......
  • Vue3使用icon组件不生效的问题()
    首先确保项目中已经安装了ant-design-vue:npminstallant-design-vue@next--save#注意使用@next来安装Vue3兼容的版本#或者yarnaddant-design-vue@next在Vue组件中引入并使用图标:(单独导入)<template><divclass="overlay-table-close-btn"@click="toggle......