• 给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。


    给定数组 nums = [1,1,2], 
    
    函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。 
    
    你不需要考虑数组中超出新长度后面的元素。
    ================================
    关于此类的题目,提取有效信息,有序数组,应该想到利用双指针来进行处理;
    我们需要跳过重复的元素,然后遇到非重复元素进行覆盖操作
    解法1.
     1  public static int removeRepeat(int[] array){
     2         int len = array.length;
     3         int temp = 0;
     4 
     5         if (len == 0 ){
     6             return 0;
     7         }else {
     8             for (int i = 0; i < len; i++) {
     9                 if (array[temp] != array[i]){
    10                     array[++temp] = array[i];
    11                 }
    12 
    13             }
    14 
    15             return temp+1;
    16 
    17         }
    18 
    19 
    20 
    21     }

    2.去重,可以利用map进行操作,以 array[i] -- i, 进行存储,这样可以起到去重的效果,然后我们遍历一遍数据,进行替换覆盖就可以了;

    注意,hashmap是非顺序存储的,我们需要保证数组的有序排列,所以需要用到有存储顺序的linkedhashmap进行存储

    这个实现有点慢,好歹也是自己第一次的解题思路,多一种思路未尝不可

     1 public static  int removeDuplicates(int[] nums) {
     2         LinkedHashMap<Integer, Integer> hashMap = new LinkedHashMap<>();
     3         for (int i = 0; i < nums.length; i++) {
     4             hashMap.put(nums[i],i);
     5         }
     6         int index = 0;
     7         for (Map.Entry<Integer, Integer> entry:hashMap.entrySet()) {
     8             Integer key = entry.getKey();
     9             nums[index] = key;
    10             index++;
    11         }
    12         return index;
    13     }




  • 相关阅读:
    两种unix网络编程线程池的设计方法
    僵尸进程处理方法
    僵尸进程概念
    fork()父子进程文件描述符的关系
    getsockname()和getpeername()
    linux文件系统总结
    deque时间复杂度和vector,list比较
    stl仿函数和适配器
    linux中断和异常睡眠问题
    umask码和文件权限
  • 原文地址:https://www.cnblogs.com/doudou2018/p/12521353.html
Copyright © 2020-2023  润新知